Java 在消息到达时显示消息,而不是在会话结束时显示所有消息

Java 在消息到达时显示消息,而不是在会话结束时显示所有消息,java,sockets,byte,bytearray,Java,Sockets,Byte,Bytearray,我试图在Java应用程序中显示以字节形式发送的消息。然而,我不能让我的应用程序在收到每一条消息时都显示出来 相反,当客户端断开连接时,它在单个字符串中显示所有消息。首先发送“你好”消息,最后发送“再见”消息给我“你好” 当消息到达服务器时,如何使用字节显示每条消息 以下是服务器线程代码: public void run() { while (true) { try { int data; String string =

我试图在Java应用程序中显示以字节形式发送的消息。然而,我不能让我的应用程序在收到每一条消息时都显示出来

相反,当客户端断开连接时,它在单个
字符串中显示所有消息。首先发送“你好”消息,最后发送“再见”消息给我“你好”

当消息到达服务器时,如何使用字节显示每条消息

以下是服务器线程代码:

public void run() {

    while (true) {

        try {

            int data;
            String string = new String();

            while ( (data = inputStream.read() ) != -1) {
                char thisChar = (char) data;
                string = string + thisChar;
            }

            System.out.println("Here is the message: " + string);

            if (inputStream.read() == -1) break;


        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    try {
        socket.close();

    } catch (IOException ex) {
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    }

    System.out.println("Client session has ended");
}
下面是发送消息的客户端:

    clientSocket.getOutputStream().write("Hello".getBytes());
    clientSocket.getOutputStream().write("Bye".getBytes());

一种方法是在每条消息的末尾添加一个分隔符,并在
inputStream.read()循环中处理该分隔符

您还可以指定消息的长度,并在消息开头追加长度。通常我们决定一种消息格式,并坚持使用它

i、 e。 信息格式:

=========================================================
= Length (2 bytes)     |           Message              =
=========================================================
你可能想看看这个链接


实际上,您正在进行
双向握手
意味着只有客户端向服务器发送数据

您需要进行
3向握手
,这意味着服务器将在接收到数据后发送确认

Message no       Client                              Server
    1           Send Message                  Receive Message
    2           Receive Acknowledgement       Send Acknowledgement of receiving
    3           Send Message                  Receive Message   

请参阅本教程。

有两种方法可以解决您的问题

首先,您可以在发送消息字节之前发送消息的长度(例如,4个字节(表示一个整数))。从另一端读取这四个字节,将整数组装回来,您就知道在消息完全传递之前应该读取多少字节

第二种方式更方便。通过套接字流使用DataInput(Output)流,并使用readLine()方法读取每条消息。例如,见:


我对Java相当陌生。你能展示一下这个的一些实现吗?@Maeh我添加了一个链接来解释。示例中给出了代码。使用方便的方法,我认为客户端和服务器都必须用Java编写?这不是必需的。看看DataInput(Output)流的来源:这里没有魔力。长度为2字节,然后是字符串的所有字节。所以,在任何其他语言中,你都可以这样做。另外,请阅读DataInputStream.readFully。当您知道字符串的长度时,这有助于读取字符串的所有字节。