Java Eclipse中丢失的套接字上的第一条消息

Java Eclipse中丢失的套接字上的第一条消息,java,eclipse,sockets,tcp,Java,Eclipse,Sockets,Tcp,我在调试模式下有一个很有趣的行为,我无法向自己解释。 有两个小型客户端和服务器应用程序,流程如下: 客户端启动TCP连接 服务器接受并向客户端发送请求数据包大小的消息(它是固定的) 客户端发送大小 服务器读取大小并初始化一些字节数组-这是可行的 服务器阻塞等待数据包的输入流中的read(),客户端发送数据包。-这就是罪魁祸首 当我运行应用程序时,这一切都能正常工作,但是当我调试服务器时,它只是阻塞read()。 如果我发送多条消息,例如50条,服务器将接收其中的49条。一旦客户端关闭连接,服务器

我在调试模式下有一个很有趣的行为,我无法向自己解释。 有两个小型客户端和服务器应用程序,流程如下:

  • 客户端启动TCP连接

  • 服务器接受并向客户端发送请求数据包大小的消息(它是固定的)

  • 客户端发送大小

  • 服务器读取大小并初始化一些字节数组-这是可行的

  • 服务器阻塞等待数据包的输入流中的
    read()
    ,客户端发送数据包。-这就是罪魁祸首

  • 当我运行应用程序时,这一切都能正常工作,但是当我调试服务器时,它只是阻塞
    read()
    。 如果我发送多条消息,例如50条,服务器将接收其中的49条。一旦客户端关闭连接,服务器从流中读取-1并退出,第一条消息丢失

    我能想到的唯一一件事是,在调试模式下,客户端在服务器从流中读取消息之前发送消息,但我不认为这与消息应该在那里有什么关系

    有人能解释一下我在调试模式下遇到的这种行为吗

    注意:客户端代码只是为了调试,所以它不是最漂亮的

    服务器

    private static int sent;
    
    public void processClientInput(HealthCheckSession session) {
    
        byte[] buffer = session.getBuffer();
        DataInputStream stream = session.getInFromClient();
    
        int readBytes = 0;
        int totalBytes = 0;
        try {
    
            while((readBytes = stream.read(buffer)) !=-1) { <---- this blocks in debug on first message
    
                totalBytes += readBytes;
    
                if (totalBytes < buffer.length)  {
    
                    continue;
                }
    
                else {
                    totalBytes = 0;
                    String packet = new String(buffer, ProtocolValidator.SERIALIZATION_CHARSET);
    
                    sendResponse(packet);
                }
            }
    
        } catch (IOException e) {e.printStackTrace();}
    }
    
    private void sendResponse(String packet) {
        System.out.println(packet);
        ++sent;
        System.out.println("sent " + sent);
    }
    
    私有静态int已发送;
    public void processClientInput(HealthCheckSession会话){
    byte[]buffer=session.getBuffer();
    DataInputStream=session.getInforomClient();
    int readBytes=0;
    int totalBytes=0;
    试一试{
    
    而((readBytes=stream.read(buffer))!=-1){你有没有可能在你的观察值中有一个计算过的表达式导致套接字读取执行?是的,读取块。它不返回任何东西,只是块。如果我只发送一个数据包。如果我发送50,那么49是读取的。我想说的是,如果我只发送一个数据包,那么它不会通过while cond我只是坐在那里。如果我发送50个数据包,循环体将执行49次。这只发生在debug O_O中。看起来你必须想出一个解决方案。你解决了吗?我可能有连接问题。(如果我在建立连接后直接发送第一条消息,它将丢失。如果我第一次睡眠10毫秒,它将被接收)你有没有可能一步一步地通过它,在你的手表值中有一个计算过的表达式,导致套接字读取执行?是的,读取块。它不返回任何东西,只是块。如果我只发送一个数据包。如果我发送50,那么49是读取的。我想说的是,如果我只发送一个数据包,那么它就不会通过ion,然后就坐在那里。如果我发送50个数据包,循环体将执行49次。这只发生在debug O_O中。看起来你必须想出一个解决方案。你解决了吗?我可能有连接问题。(如果我在建立连接后直接发送第一条消息,它将丢失。如果我第一次睡眠10毫秒,它将被接收)
    public static void main(String[] args) throws UnknownHostException,
            IOException, InterruptedException {
    
        Socket clientSocket = new Socket("localhost", 10002);
    
        // get the socket's output stream and open a PrintWriter on it
        PrintWriter outToServer = new PrintWriter(
                clientSocket.getOutputStream(), true);
    
        // get the socket's input stream and open a BufferedReader on it
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));
    
        System.out.println("before read");
        System.out.println(inFromServer.readLine());
        System.out.println("after read");
    
        byte[] packageData = "100, ABCDZEGHR"
                .getBytes(Charset.forName("UTF-8"));
    
        String size = String.valueOf(packageData.length);
        outToServer.println(size);
    
        for (int i = 0; i < 50; i++) {
    
            DataOutputStream dis = new DataOutputStream(
                    clientSocket.getOutputStream());
            System.out.println("before write");
            dis.write(packageData);
            dis.flush();
            System.out.println("after write");
    
            Thread.sleep(1000);
        }
    
        try {
            Thread.sleep(100 * 1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        clientSocket.close();
    }