浅谈Java之多线程处理TCP请求

一、基本介绍

在Java中,处理TCP请求通常涉及到服务器和客户端的概念。服务器监听某个端口,等待客户端的连接请求,而客户端则发起连接到服务器的请求。在多线程环境中,服务器可以同时处理多个客户端的请求。

二、简单示例

下面是一个简单的示例,展示如何使用Java的ServerSocketSocket类来创建一个多线程的TCP服务器。

1. 服务器端

服务器端使用ServerSocket来监听端口,每当有客户端连接时,它就创建一个新的线程来处理这个连接。

java 复制代码
import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        int port = 12345; // 服务器监听的端口
        ServerSocket serverSocket = new ServerSocket(port);

        while (true) {
            Socket clientSocket = serverSocket.accept(); // 接受客户端连接
            new ClientHandler(clientSocket).start(); // 为每个客户端创建新线程
        }
    }
}

class ClientHandler extends Thread {
    private Socket clientSocket;

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

    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            OutputStream out = clientSocket.getOutputStream();
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("Received: " + inputLine);
                out.write(("Echo: " + inputLine + "\n").getBytes());
            }
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 客户端

客户端使用Socket来连接服务器,并发送消息。

java 复制代码
import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        String hostName = "localhost";
        int portNumber = 12345;

        Socket socket = new Socket(hostName, portNumber);

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

        String userInput;
        System.out.println("Enter messages (leave empty line to quit):");
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            if (userInput.isEmpty()) {
                break;
            }
            String fromServer = in.readLine();
            System.out.println("Echo: " + fromServer);
        }

        out.close();
        in.close();
        socket.close();
    }
}

说明:

  1. 服务器端

    • 使用ServerSocket在指定端口上监听。
    • 每当有新的客户端连接,就创建一个新的ClientHandler线程来处理这个连接。
    • ClientHandler类继承自Thread,用于处理客户端的输入和输出。
  2. 客户端

    • 通过Socket连接到服务器。
    • 发送消息到服务器,并接收服务器的响应。

这个示例展示了如何使用Java进行基本的多线程TCP通信。你可以根据需要扩展这个示例,比如添加错误处理、支持更多的并发连接等。

相关推荐
皮皮林5515 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
卡尔特斯10 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源10 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole10 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫10 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide11 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户37215742613511 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源11 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
Java中文社群12 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心12 小时前
从零开始学Flink:数据源
java·大数据·后端·flink