我有一个非常简单的多线程服务器,只打印回客户端的输入。我遇到的问题是客户端在多次使用outToServer.writeBytes()
后崩溃了。
我的客户端源代码在这里:
public class Client {
public void run() throws Exception{
String sentence;
Socket clientSocket = new Socket("localhost", 25565);
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
while (true){
sentence = inFromUser.readLine();
if(!sentence.equalsIgnoreCase("exit")){
outToServer.writeBytes(sentence + '\n');
} else {
break;
}
}
clientSocket.close();
}
}
我已经对错误进行了一些研究,可能是我的大学网络破坏了连接,但鉴于它允许第一次连接,它没有多大意义。
另外,这是错误:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.writeBytes(Unknown Source)
at com.cs.Client.run(Client.java:21)
at com.cs.Main.main(Main.java:14)
在Client.java的第21行是其中包含writeBytes
的行
答案 0 :(得分:0)
打开连接并不像打开门。连接是虚拟概念,而不是保证路径。
因此,当您打开连接时,基本上您已经重新配置了一些操作系统管理的内存区域,以便知道当您将数据写入特定内存位置时,它需要在线路上复制该数据。
这意味着打开连接并不总是共享事件(因为远程计算机可能无法完全保证程序的路径,甚至可能不知道请求了远程程序的路径)。
因此,在网络编程中,尽管API措辞暗示其他方面,但在您从远程计算机获得第一个响应之前,您不会有功能连接。
我看看你是否可以启动wireshark并查看你是否可以在发送之前捕获数据,并且我检查任何连接参数,并尝试独立于程序验证连接可达性。 / p>
上述程序将帮助您从客户端的角度快速识别出哪个网络组件出现故障;然而,90%的时间,这是非常微不足道的事情,就像软件防火墙阻止了所需的端口。
此外,您可以使用telnet提供类似的功能,但连接到非标准端口。
telnet hostname 25565
祝你好运,而且你的代码似乎很合理,我花了一点时间确保在环境可能出错时你不会专注于代码。