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

时间:2014-02-20 12:28:57

标签: java sockets byte bytearray

我试图在我的Java应用程序中显示以字节形式发送的消息。但是,我无法让我的应用程序在到达时显示每条消息。

相反,它会在客户端断开连接时显示单个String中的所有消息。首先发送“Hello”消息,最后发送“Bye”消息给我“HelloBye”

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

这是服务器线程代码:

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());

3 个答案:

答案 0 :(得分:1)

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

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

即。 消息格式:

=========================================================
= Length (2 bytes)     |           Message              =
=========================================================

您可能需要查看此链接

Delimit data coming from socket

答案 1 :(得分:0)

实际上你正在做2 way handshaking意味着只有客户端将数据发送到服务器。

您需要执行3 way hand shaking表示服务器会在收到数据后发送确认。

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

请参阅本教程Socket Programming with TCP

答案 2 :(得分:0)

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

首先,您可以在发送字节之前发送消息的长度(例如,4个字节(例如,呈现一个整数))。读取另一侧的这四个字节以组合整数,你知道在消息完全传递之前应该读取多少字节。

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

http://journals.ecs.soton.ac.uk/java/tutorial/networking/sockets/readingWriting.html