Java编程实现多线程TCP服务器完整实例
简介
本文将通过Java代码实现一个多线程的TCP服务器,包含完整的代码以供参考。该服务器能够同时服务多个客户端,每个客户端都在独立的线程中运行。本文将介绍如何实现TCP Socket编程,以及如何使用Java多线程进行并发编程。
实现目标
- 实现一个多线程TCP服务器,支持多客户端同时连接。
- 服务器能够接受客户端连接,并读取并输出客户端发送的消息。
- 服务器能够向客户端发送消息,并关闭连接。
代码实现
以下是实现该目标的Java代码,我们对其进行分析:
import java.io.*;
import java.net.*;
public class MultithreadedTCPServer {
public static void main(String[] args) throws IOException {
//创建一个ServerSocket监听端口
int portNumber = 5000;
try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
System.out.println("服务器启动,监听端口号: " + portNumber);
//循环等待客户端连接
while (true) {
//客户端连接成功,创建新的Socket来处理客户端请求
new ClientThread(serverSocket.accept()).start();
}
} catch (IOException e) {
System.err.println("无法监听端口 " + portNumber);
System.exit(-1);
}
}
}
//处理客户端请求的线程类
class ClientThread extends Thread {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
public ClientThread(Socket socket) {
super("ClientThread");
this.socket = socket;
}
public void run() {
try {
System.out.println("客户端连接成功。地址:" + socket.getRemoteSocketAddress());
//获取Socket的输入输出流,用于向客户端发送和接收消息
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
//客户端发送了"Bye"时,关闭连接
if (inputLine.equals("Bye")) {
break;
}
//向客户端发送消息
out.println("服务器响应:" + inputLine);
}
//关闭连接
out.close();
in.close();
socket.close();
System.out.println("客户端断开连接。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码实现分析
程序入口
程序入口使用了Java的main方法,其创建了一个ServerSocket并循环等待客户端的连接。
int portNumber = 5000;
try (ServerSocket serverSocket = new ServerSocket(portNumber)) {
System.out.println("服务器启动,监听端口号: " + portNumber);
//循环等待客户端连接
while (true) {
//客户端连接成功,创建新的Socket来处理客户端请求
new ClientThread(serverSocket.accept()).start();
}
} catch (IOException e) {
System.err.println("无法监听端口 " + portNumber);
System.exit(-1);
}
其创建一个ServerSocket并绑定在5000端口,表示该服务器将会监听5000端口连接请求。当客户端连接时,主线程将创建一个新的ClientThread线程,并传入连接的Socket作为参数,然后启动该线程。
客户端线程
当客户端连接时,程序将通过一个ClientThread对象来处理客户端请求。该线程需要完成以下任务:
- 获取Socket的输入输出流,用于向客户端发送和接收消息。
- 读取客户端发送的消息,并向客户端发送响应消息。
- 关闭连接。
class ClientThread extends Thread {
private Socket socket;
private PrintWriter out;
private BufferedReader in;
public ClientThread(Socket socket) {
super("ClientThread");
this.socket = socket;
}
public void run() {
try {
System.out.println("客户端连接成功。地址:" + socket.getRemoteSocketAddress());
//获取Socket的输入输出流,用于向客户端发送和接收消息
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
//客户端发送了"Bye"时,关闭连接
if (inputLine.equals("Bye")) {
break;
}
//向客户端发送消息
out.println("服务器响应:" + inputLine);
}
//关闭连接
out.close();
in.close();
socket.close();
System.out.println("客户端断开连接。");
} catch (IOException e) {
e.printStackTrace();
}
}
}
该线程包含了一个私有成员变量Socket,一个PrintWriter对象用于向客户端发送消息,一个BufferedReader对象用于接收客户端的消息。
当客户端连接服务器时,线程的run方法会被执行。在该方法中,首先获取了Socket的输入输出流,用于向客户端发送和接收消息。接着,它会读取客户端发送的消息,并向客户端发送响应消息。当客户端发送了"Bye"时,该线程将关闭连接。
示例
示例1
现在我们可以启动服务器,这可以通过执行MultithreadedTCPServer类的main方法来实现。当服务器开始监听端口时,我们可以启动多个客户端,这通过执行以下客户端代码和使用telnet命令行工具来实现:
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws IOException {
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
try (
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;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("服务器响应: " + in.readLine());
if (userInput.equals("Bye"))
break;
}
} catch (UnknownHostException e) {
System.err.println("无法确定主机: " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("无法连接到主机: " + hostName);
System.exit(1);
}
}
}
执行代码java TCPClient localhost 5000
可以启动一个客户端并连接到之前启动的服务器。这将打开一个输入流,可以在其中输入消息并将其发送到服务器。服务器会处理这些请求,然后返回响应消息。
示例2
我们可以使用telnet命令来手动连接到之前启动的服务器。在终端输入命令telnet localhost 5000
就能连接到服务器。输入消息并按Enter键发送,服务器将会打印出消息并返回响应消息。当要断开连接时,输入"Bye"即可关闭TCP连接。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java编程实现多线程TCP服务器完整实例 - Python技术站