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