gpt4 book ai didi

java - 多线程Java服务器

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:51 24 4
gpt4 key购买 nike

我正在尝试制作一个简单的 ECHO 服务器来管理更多客户端。

服务器类别:

public class EchoServer {

protected int port ;
protected ServerSocket socket;
private Socket acceptedSocket;

public EchoServer(int port) throws IOException {
this.port = port;
socket = new ServerSocket(port);
}

public void start() throws AcceptingClientException {
while(!socket.isClosed()) {
try {
acceptedSocket = socket.accept();
}
catch (IOException e){
throw new AcceptingClientException();
}
ClientHandler ch = new ClientHandler(acceptedSocket);
ch.run();
}
}
}

可运行的客户端处理程序:

public class ClientHandler implements Runnable {

Socket socket;

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

@Override
public void run() {
PrintWriter From_Server = null;
BufferedReader To_Server = null;
String to_server_string = null;
try {
From_Server = new PrintWriter(socket.getOutputStream());
To_Server =
new BufferedReader(
new InputStreamReader( socket.getInputStream()));
System.out.println("Stream opened.\n");
while(true) {
if(To_Server.ready()){
System.out.println("Reading input line.\n");
to_server_string = To_Server.readLine();
if(to_server_string.equalsIgnoreCase("quit")) {
System.out.println("Connection closed on user request.\n");
From_Server.print("Bye :)\n");
From_Server.close();
To_Server.close();
socket.close();
}
else {
System.out.println(
"String '" +
to_server_string+"' is not 'quit', echoing.\n");
From_Server.print("ECHO: "+to_server_string+"\n");
System.out.println("String written on stream, flushing.\n");
From_Server.flush();
}
}
}
}
catch (IOException e) {
System.out.println("Stream error (connection closed?).\n");
}
}
}

主类

public static void main(String[] args) {
try {
EchoServer server= new EchoServer(9999);
server.start();
}
catch (IOException ex) {
System.out.println("Unable to start server (port is busy?)\n");
Logger.getLogger(SimpleServer.class.getName()).log(Level.SEVERE, null, ex);
}
catch (AcceptingClientException e){
System.out.println("Unable to accept client\n");
}
}

多个客户端能够连接到服务器,但 ECHO 只能与一个客户端一起工作(如果我关闭与一个客户端的连接,服务器将开始自动处理另一个客户端),但我不明白为什么:当客户端连接到服务器时,使用 server.accept() 创建的关联 socked 被传递到一个可运行客户端处理程序的新实例,该实例是使用 handler.run() 启动的,并且服务器应该在 server.accept() 中继续等待(除非 ServerSocket 关闭) )。我假设问题应该出在服务器类的这个方法上:

public void start() throws AcceptingClientException {
while(!socket.isClosed()) {
try {
acceptedSocket=socket.accept();
}
catch (IOException e){
throw new AcceptingClientException();
}
ClientHandler ch = new ClientHandler(acceptedSocket);
ch.run();
}
}

但我不知道它出了什么问题......我错过了什么?

最佳答案

您的代码:

ClientHandler ch = new ClientHandler(acceptedSocket);
ch.run();

不启动新线程,它委托(delegate)给同一线程中的ClientHandler.run()

要启动线程,请使用 new Thread( ch ).start();,因为 ch 属于实现 Runnable 的类 ClientHandler

关于java - 多线程Java服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com