gpt4 book ai didi

java - 多个套接字导致 ConnectException : Connection refused: connect

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:07 29 4
gpt4 key购买 nike

我在 Windows XP 上的 Eclipse 中编写 java 程序。我有一个多进程模拟,它使用 ProcessBuilder 来运行一个服务器和两个客户端。服务器启动一个线程来监听两个不同的套接字——每个客户端一个。我可以为每个客户注释掉代码,让其他客户工作得很好。当我尝试同时运行它们时,一个客户端总是会出现 ConnectException 错误:Connection refused: connect。它似乎是哪个客户端运行速度较慢,虽然很难说。我可以在启动服务器之后但在客户端之前暂停,netstat 验证两个套接字是否都处于 Activity 状态。是什么原因造成的?我在下面有一些简化的代码。

更新:根据评论,我编辑了代码以在单个套接字上对服务器进行多线程处理,但我仍然遇到同样的问题。下面的代码反射(reflect)了这些变化。似乎在另一个客户端有机会打开它之前,一个客户端正在打开和关闭套接字。我可以在每个客户端的末尾抛出暂停语句,以允许另一个客户端完成,但这是一种修复,而不是解决方案。所以现在真正的问题是,如何让 ServerSocket 保持监听直到我指示它关闭?

服务器

try{
server = new ServerSocket(sockNum);
} catch (IOException e) {
System.out.printf("Could not listen on port %d\n",sockNum);
System.exit(-1);
}
while(true){
ClientWorker w;
try{
Socket connection = server.accept();
w = new ClientWorker(connection);
Thread t = new Thread(w);
t.start();
} catch (IOException e) {
System.out.printf("Accept failed: %d\n",sockNum);
System.exit(-1);
}
}

class ClientWorker implements Runnable {
private Socket client;

ClientWorker(Socket client) {
this.client = client;
}

public void run(){
Object line;
ObjectInputStream in = null;
PrintWriter out = null;
try{
in = new ObjectInputStream(client.getInputStream());
out = new PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.out.println("in or out failed");
System.exit(-1);
}

while(true){
try{
line = in.readObject();
//Send data back to client
out.println("Sent from broker");
if(line instanceof String)
System.out.println(line);
else
System.out.println(line.getClass());
} catch (IOException e) {
System.out.println("Read failed");
System.exit(-1);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

客户

 try{
socket = new Socket("localhost", socketNum);
out = new ObjectOutputStream(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out.writeObject(message);
String line = in.readLine();
System.out.println(line);
} catch (UnknownHostException e) {
System.out.println("Unknown host: localhost.eng");
System.exit(1);
} catch (IOException e) {
System.out.println("No I/O");
System.exit(1);
}

Controller

ProcessBuilder server = new ProcessBuilder("java.exe","-Xss64m","-cp","bin;jscheme.jar","ServerProcess");
server.redirectErrorStream(true);
Process runServer = server.start();

ProcessBuilder clientA = new ProcessBuilder("java.exe","-Xss64m","-cp","bin;jscheme.jar","ClientAProcess");
clientA.redirectErrorStream(true);
Process runClientA = clientA.start();

ProcessBuilder clientB = new ProcessBuilder("java.exe","-Xss64m","-cp","bin;jscheme.jar","ClientBProcess");
clientB.redirectErrorStream(true);
Process runClientB = clientB.start();

最佳答案

“服务器启动一个线程来监听两个不同的套接字 - 每个客户端一个。”

不,请不要这样做!为每个客户端分配一个单独的监听套接字是不正常的设计。只需启动一个两个客户端都连接到的监听线程。当 accept() 返回时,为该客户端启动一个读取线程,传递由 accept() 调用返回的 ServerClient 套接字。

关于java - 多个套接字导致 ConnectException : Connection refused: connect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10181941/

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