有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

sockets Java程序在多次使用writeBytes后崩溃

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

在客户机的第21行。java是带有writeBytes的一行


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

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

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

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

    telnet hostname 25565
    

    祝你好运,而且你的代码看起来很合理,我会花一点时间确保你在环境可能出问题的时候不会把注意力集中在代码上