温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Socket套接字如何实现多线程通信

发布时间:2025-07-07 13:31:25 来源:亿速云 阅读:109 作者:小樊 栏目:编程语言

在Java中,使用Socket套接字实现多线程通信通常涉及两个主要组件:服务器端和客户端。服务器端负责监听客户端的连接请求,并为每个连接的客户端创建一个新的线程来处理通信。客户端则负责与服务器建立连接并发送/接收数据。

以下是使用Java Socket实现多线程通信的基本步骤:

服务器端

  1. 创建ServerSocket:

    ServerSocket serverSocket = new ServerSocket(port);
    

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

  2. 接受客户端连接:

    Socket clientSocket = serverSocket.accept();
    

    accept()方法会阻塞,直到有客户端连接到服务器。

  3. 为每个客户端创建一个线程:

    new ClientHandler(clientSocket).start();
    

    这里ClientHandler是一个实现了Runnable接口的类,用于处理与单个客户端的通信。

  4. 实现ClientHandler类:

    class ClientHandler implements Runnable {
        private Socket clientSocket;
    
        public ClientHandler(Socket socket) {
            this.clientSocket = socket;
        }
    
        @Override
        public void run() {
            try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                 PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
                String inputLine;
                while ((inputLine = in.readLine()) != null) {
                    // 处理接收到的数据
                    out.println("Server received: " + inputLine);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    clientSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

客户端

  1. 创建Socket:

    Socket socket = new Socket(serverAddress, port);
    

    其中serverAddress是服务器的IP地址或主机名,port是服务器监听的端口号。

  2. 获取输入输出流:

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    
  3. 发送和接收数据:

    out.println("Hello, Server!");
    String response = in.readLine();
    System.out.println(response);
    
  4. 关闭Socket:

    socket.close();
    

完整示例

服务器端代码

import java.io.*;
import java.net.*;

public class MultiThreadedServer {
    public static void main(String[] args) throws IOException {
        int port = 12345;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server started on port " + port);

        while (true) {
            Socket clientSocket = serverSocket.accept();
            System.out.println("New client connected: " + clientSocket.getInetAddress().getHostAddress());
            new ClientHandler(clientSocket).start();
        }
    }
}

class ClientHandler implements Runnable {
    private Socket clientSocket;

    public ClientHandler(Socket socket) {
        this.clientSocket = socket;
    }

    @Override
    public void run() {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
             PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println("Server received: " + inputLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端代码

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        String serverAddress = "localhost";
        int port = 12345;
        Socket socket = new Socket(serverAddress, port);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        out.println("Hello, Server!");
        String response = in.readLine();
        System.out.println(response);

        socket.close();
    }
}

通过这种方式,服务器可以同时处理多个客户端的连接,每个客户端连接都在一个独立的线程中进行处理,从而实现多线程通信。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手