当前位置: 首页 > news >正文

Socket如何实现客户端和服务器间的通信

Socket 是实现网络通信的一种机制,它允许在不同主机之间的进程通过网络进行数据交换。下面我将简要介绍如何使用 Socket 实现客户端和服务器间的通信。

客户端-服务器通信步骤:

服务器端:

创建服务器端 Socket

  • 服务器端通过创建一个 ServerSocket 对象来监听指定的端口,等待客户端连接。

ServerSocket serverSocket = new ServerSocket(portNumber);

其中 portNumber 是服务器端监听的端口号。

接受客户端连接

  • 一旦有客户端连接,ServerSocket 就会返回一个 Socket 对象,该对象代表了和客户端的通信通道。

Socket clientSocket = serverSocket.accept();

这一步是阻塞操作,直到有客户端连接进来才会继续执行。

获取输入输出流

  • 通过 Socket 对象,可以获取输入流和输出流,进行数据的读写操作。

InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();

处理客户端请求

  • 在获得了输入流之后,可以从中读取客户端发送的数据,并根据协议进行相应的处理。

关闭连接

  • 处理完毕后,记得关闭 SocketServerSocket,释放资源。

clientSocket.close();
serverSocket.close();
客户端:

创建客户端 Socket

  • 客户端通过创建一个 Socket 对象来连接到服务器的指定地址和端口。

Socket socket = new Socket(serverAddress, portNumber);

其中 serverAddress 是服务器的地址,portNumber 是服务器端监听的端口号。

获取输入输出流

  • 通过 Socket 对象,可以获取输入流和输出流,进行数据的读写操作。

InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();

发送请求和接收响应

  • 使用输出流向服务器发送数据,使用输入流从服务器接收数据。

关闭连接

  • 处理完毕后,记得关闭 Socket,释放资源。

socket.close();

示例代码:

服务器端代码:
import java.io.*;
import java.net.*;
​
public class Server {public static void main(String[] args) {int portNumber = 8088;
​try (ServerSocket serverSocket = new ServerSocket(portNumber)) {System.out.println("Server listening on port " + portNumber);while (true) {Socket clientSocket = serverSocket.accept();System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress());
​// 获取输入流InputStream inputStream = clientSocket.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));// 读取客户端发送的数据String clientMessage = reader.readLine();System.out.println("Received from client: " + clientMessage);// 获取输出流OutputStream outputStream = clientSocket.getOutputStream();PrintWriter writer = new PrintWriter(outputStream, true);// 发送响应给客户端writer.println("Message received successfully!");// 关闭连接clientSocket.close();}} catch (IOException e) {e.printStackTrace();}}
}
客户端代码:
import java.io.*;
import java.net.*;
​
public class Client {public static void main(String[] args) {String serverAddress = "127.0.0.1";int portNumber = 12345;
​try (Socket socket = new Socket(serverAddress, portNumber)) {System.out.println("Connected to server at " + serverAddress + ":" + portNumber);// 获取输出流OutputStream outputStream = socket.getOutputStream();PrintWriter writer = new PrintWriter(outputStream, true);// 发送数据给服务器writer.println("Hello from client!");// 获取输入流InputStream inputStream = socket.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));// 读取服务器响应String serverResponse = reader.readLine();System.out.println("Server response: " + serverResponse);} catch (IOException e) {e.printStackTrace();}}
}

http://www.lryc.cn/news/415164.html

相关文章:

  • 基于Spring boot + Vue的校园论坛
  • RabbitMQ高级特性 - 生产者消息确认机制
  • webpack的loader机制
  • (STM32笔记)十一、通过EXTI外部中断实现 按键控制LED
  • 假如家里太大了,wifi连不上了怎么办
  • elementPlus 设置el-input文本域固定高度和禁止下拉
  • (转)领导人必过的三道关
  • 速盾:cdn可以定时刷新缓存吗?
  • 代码随想录算法训练营第二十九天| 62.不同路径、63. 不同路径 II
  • Go+Redis零基础到用户管理系统API实战_20240730 课程笔记
  • ScreenAgent:基于LVLM的计算机控制智能体
  • 谷粒商城实战笔记-129-商城业务-商品上架-nested数据类型场景
  • axios请求响应拦截器
  • Python 中单例模式实现的几种方式
  • mysql数据库触发器同步数据
  • Prometheus-v2.45.0+Grafana+邮件告警
  • LeetCode——572. 另一颗树的子树
  • Spring Boot整合MyBatis-Flex
  • 重塑未来体验:边缘计算与云原生的完美邂逅
  • 浅谈基础数论(c++)
  • jdk 17新特性 sealed 关键字
  • 在仪器计量校准中,无尘车间洁净室检测有哪些方法和流程?
  • 【跨时代】第四次工业革命彻底来袭!什么是AI+
  • 前端性能优化-纲领篇
  • 深度学习-----------数值稳定性
  • SpringBoot项目接口可以承受的调用次数
  • 抽象代数精解【8】
  • 数据结构与算法 - 二叉树
  • Spring Cloud Gateway如何给一个请求加请求头
  • chromedriver版本下载地址汇总chromedriver所有版本下载地址汇总国内源下载