Java 如何管理大量传入数据包

Java 如何管理大量传入数据包,java,sockets,client,packet,server,Java,Sockets,Client,Packet,Server,我有一个带远程客户端的socketserver,它可以正常工作。在打开客户端并登录时,我注意到有时会出现一个错误,这似乎是由于客户端在不应该读取int时读取了int 登录后,服务器向客户端发送一系列消息/数据包,这些消息/数据包包括从字符串消息到用于在客户端加载变量的信息 有时,在登录时,会抛出一个错误,显示客户端已读取大小为0或非常大的数据包。在将这个大数字转换成ascii码时,我曾经发现它有点像字符串sk。我在代码中找到了这个字符串,所以它不是完全随机的 看看我的代码,我不知道为什么会发生这

我有一个带远程客户端的socketserver,它可以正常工作。在打开客户端并登录时,我注意到有时会出现一个错误,这似乎是由于客户端在不应该读取int时读取了int

登录后,服务器向客户端发送一系列消息/数据包,这些消息/数据包包括从字符串消息到用于在客户端加载变量的信息

有时,在登录时,会抛出一个错误,显示客户端已读取大小为0或非常大的数据包。在将这个大数字转换成ascii码时,我曾经发现它有点像字符串sk。我在代码中找到了这个字符串,所以它不是完全随机的

看看我的代码,我不知道为什么会发生这种情况。客户端是否可能在错误的时间读取int?如果是,我如何解决这个问题

        InetAddress address = InetAddress.getByName(host);
        connection = new Socket(address, port);
        in = new DataInputStream(connection.getInputStream());
        out = new DataOutputStream(connection.getOutputStream());
        String process;
        System.out.println("Connecting to server on "+ host + " port " + port +" at " + timestamp);
        process = "Connection: "+host + ","+port+","+timestamp + ". Version: "+version;
        write(0, process);
        out.flush();
        while (true) {
            int len = in.readInt();
            if (len < 2 || len > 2000) {
                throw new Exception("Invalid Packet, length: "+len+".");
            }
            byte[] data = new byte[len];
            in.readFully(data);
            for (Byte b : data) {
                System.out.printf("0x%02X ",b);
            }
            try {
                reader.handlePackets(data);
            } catch (Exception e) {
                e.printStackTrace();
                //connection.close();
                //System.exit(0);
                //System.out.println("Exiting");
            }
        }


//Here is code for my write function (Server sided):
public static void write(Client c, Packet pkt) {
    for (Client client : clients) {
        if (c.equals(client)) {
            try {
                out.writeInt(pkt.size());
                out.write(pkt.getBytes());
                out.flush();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}
因此,看看write函数,我真的看不出它会如何混淆客户机,并使其对一个数据包的数据包大小读取两次,至少我认为是这样的


如果您需要更多信息,请询问我。

客户端代码看起来不错,服务器端代码也不错

最可能的问题是,这是一种多线程和不正确同步的问题。例如,可能有两个服务器端线程试图同时将数据包写入同一客户机


您的数据包类的大小和getBytes实现也可能不一致。。。或者一个线程正在修改数据包对象,而另一个线程正在发送数据包对象

请给我们看一下你的课程包。我已经在这里准备好了。什么会导致不正确的同步?另外,据我所知,每次服务器写入数据包时,它都是一个新的数据包,因此它不应该修改另一个我认为不应该修改的数据包。我想这和尺寸有关,但我还没找到。如果是这样的话,考虑到每次都发送相同的数据包,那么在每次登录时不应该有这个问题吗?相反,它只会在40-60%的时间内发生。什么会导致不正确的同步错误代码。相反,它只会在40-60%的时间内发生。。这与您的应用程序的同步问题不一致。您能说得更多吗?我已经在发送/接收数据包之前和之后打印了数据包大小,并且大小似乎没有改变。然而,问题依然存在,有时我在登录时仍然会收到一个大小为0的数据包。我可以就此写一本书。但这是多余的,因为其他人已经这样做了。我建议您阅读有关编写并发/多线程程序的Oracle Java教程部分,特别注意其中有关同步和线程安全的部分。Ooops。。。这和同步问题是一致的。打字错误