- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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/
我搜索了很多,但我找不到很好的答案。我使用 try_catch block 来处理这个异常(如果抛出这个异常,将向用户显示一帧,我会告诉他/她一个消息),但它仍然在控制台中显示异常。请帮助我。谢谢。
我不明白这一点...我正在 try catch java.net.ConnectException,以防我的下游 API 处于离线状态。但是 Eclipse 警告我它无法访问 - 暗示代码不能抛出 C
这个问题在这里已经有了答案: Java RMI : connection refused (2 个答案) 关闭 5 年前。 当我尝试访问服务器 lonrs07471 (linux) 上的应用程序时出
我使用下面的 Java 代码来发送电子邮件。 import java.util.*; import javax.mail.*; import javax.mail.internet.*; import
所以简而言之,我只是想得到一个小的工作骨架程序,我可以用它来了解 Http 通信并“感觉”我的方式来弄清楚我最终需要什么来构建一个更大的程序我正在努力。此处的这段特定代码实际上只是 Apache 库示
所以我有一个通过Socket与服务器通信的android应用程序。昨天在某个时候工作。晚上,我想做更多的工作,但是它根本引发了异常,而我根本没有修改代码。 重建项目2次后,我测试了一个应用程序的连接,
我尝试通过REST发送请求。 使用firefox rest-client时,我得到成功响应, 但是在SoapUI中,我在下面附加了异常。 如何解决这个问题? 谢谢。 java.net.ConnectE
如果远程参与者因断电而无法使用,监督策略可以处理这种情况吗? 我已经对示例进行了编码,并且已经关闭了远程参与者系统,但似乎监督策略仅考虑远程参与者在到达后抛出的异常。 由于我不是 Akka 专家,我想
我正在尝试使用以下脚本将一些本地文件复制到HDFS: bin/hadoop fs -copyFromLocal '/home/czy/IdeaProjects/HadoopInAction/First
我有以下代码片段: private static String post(String msg) throws Exception { URL urlObj = new URL(host);
我正在将 NetBeans 与 Java 结合使用。我正在尝试从需要日志记录的网站中提取数据,我进入一个帐户提取数据,然后进入另一个帐户,我的代码正在工作,但总是在一段时间后得到: java.net.
我创建了一个简单的 java RMI 程序来理解它是如何工作的。但是当我尝试运行我的服务器端时,它引发了以下异常。 编辑:我们正在使用代理连接... Remote exception: java.r
我正在开发一个使用套接字的 Android 应用程序。我有一个名为 initializeStreams() 的函数,它打开套接字并尝试连接。如果无法建立连接,此函数将抛出 ConnectExcepti
我有一个像这样定义的kafka制作人 public KafkaMessageProducer(String kafkaHost, String kafkaPort, Map map) {
我有 2 个虚拟机(Ubuntu),第一个作为主机,第二个作为从机,当我在远程机器上运行测试时,我得到以下信息: rconfigure() 方法 java.rmi.ConnectException 中
我想使用 Groovy 脚本访问网页。但是我支持代理。 这是一个失败的测试脚本...... println "Google page is..." println 'http://www.google
我有一个从eclipse运行的android模拟器,只是试图连接到我在.NET(C#)中编写的简单套接字服务器。 服务器在端口4505的同一台计算机上运行。我能够通过PuTTy telnet到服务器,
我正在使用用于Apache-spark的scala API编写一个简单的独立程序。我需要从HDFS访问文件。来自shell的简单命令(例如hadoop fs -ls)可以正常工作。但是,当我尝试从程序
连接被拒绝,因为服务器未按预期处理连接。我希望服务器使用线程或池,以便它可以处理多个客户端。如果客户端断开连接,就像这里发生的那样,这不会对服务器产生影响,也不会阻止其他客户端连接。 将此功能添加到服
我正在尝试实现 TCP 连接,从服务器端一切正常,但当我运行客户端程序(从客户端计算机)时,出现以下错误: java.net.ConnectException: Connection refused
我是一名优秀的程序员,十分优秀!