Java-多次使用写字节后程序崩溃

Java-多次使用写字节后程序崩溃,java,sockets,dataoutputstream,Java,Sockets,Dataoutputstream,我有一个非常简单的多线程服务器,它只打印回客户端的输入。我遇到的问题是,客户端在多次使用outToServer.writeBytes后崩溃 我的客户端源代码如下: public class Client { public void run() throws Exception{ String sentence; Socket clientSocket = new Socket("localhost", 25565); Buffered

我有一个非常简单的多线程服务器,它只打印回客户端的输入。我遇到的问题是,客户端在多次使用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行中,有写字节

打开连接不像打开一扇门。连接是一个虚拟概念,而不是一个保证的路径

因此,当您打开一个连接时,基本上您已经重新配置了一些操作系统管理的内存区域,以便知道当您将数据写入特定的内存位置时,它需要在线路上复制该数据

这意味着打开连接并不总是一个共享事件,因为远程计算机可能无法完全保证程序的路径,甚至可能不知道请求了远程程序的路径

因此,在网络编程中,尽管API的措辞暗示了其他方面,但在从远程机器获得第一个响应之前,您没有功能连接

我会看看你是否可以启动wireshark,看看你是否可以在发送之前捕获数据,我会检查任何连接参数,并尝试独立于程序验证连接的可达性

上述过程将帮助您从客户的角度快速确定哪个网络组件有故障;然而,90%的情况下,这是一件非常琐碎的事情,比如软件防火墙阻止所需的端口

此外,您还可以使用telnet提供类似的功能,但要连接到非标准端口

telnet hostname 25565

祝你好运,而且你的代码看起来很合理,我会花一点时间确保你在环境可能出现故障时不会关注代码。

什么是异常?请发布异常。如果它没有被捕获,至少没有被记录,那才是真正的问题。很可能它会告诉你出了什么问题。此外,这是一个新手错误,但假设网络连接在获得后可用是非常常见的,只要您愿意。事实并非如此,所以如果你真的想拥有一个健壮的程序,就不要像解决问题那样解决问题。我知道我忘了什么。我现在要添加一个例外是的,我看到了那篇帖子,因此在我的问题中声明:我对错误做了一些研究,可能是我的大学网络破坏了连接。不过,我还是发布了这个问题,以防它与我的代码有关。无论如何,引用我的问题,它没有多大意义,因为它允许第一个连接也可能希望刷新输出流。但是异常表明刷新输出流不是您当前遇到的问题。