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

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

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

服务器端:

创建服务器端 Socket

  • 服务器端通过创建一个 ServerSocket 对象来监听指定的端口,等待客户端连接。
java 复制代码
ServerSocket serverSocket = new ServerSocket(portNumber);

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

接受客户端连接

  • 一旦有客户端连接,ServerSocket 就会返回一个 Socket 对象,该对象代表了和客户端的通信通道。
java 复制代码
Socket clientSocket = serverSocket.accept();

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

获取输入输出流

  • 通过 Socket 对象,可以获取输入流和输出流,进行数据的读写操作。
java 复制代码
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();

处理客户端请求

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

关闭连接

  • 处理完毕后,记得关闭 SocketServerSocket,释放资源。
java 复制代码
clientSocket.close();
serverSocket.close();
客户端:

创建客户端 Socket

  • 客户端通过创建一个 Socket 对象来连接到服务器的指定地址和端口。
java 复制代码
Socket socket = new Socket(serverAddress, portNumber);

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

获取输入输出流

  • 通过 Socket 对象,可以获取输入流和输出流,进行数据的读写操作。
java 复制代码
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();

发送请求和接收响应

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

关闭连接

  • 处理完毕后,记得关闭 Socket,释放资源。
java 复制代码
socket.close();

示例代码:

服务器端代码:
java 复制代码
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();
        }
    }
}
客户端代码:
java 复制代码
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();
        }
    }
}
相关推荐
没有bug.的程序员8 分钟前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋33 分钟前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国1 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~1 小时前
《设计模式》装饰模式
java·设计模式
A尘埃1 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交1 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
CHEN5_022 小时前
【Java基础面试题】Java基础概念
java·开发语言
二十雨辰3 小时前
[TG开发]照片机器人
java·web3
武昌库里写JAVA3 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
落霞的思绪4 小时前
Java设计模式详细解读
java·开发语言·设计模式