我试图在我的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());
答案 0 :(得分:1)
一种方法是在每条消息的末尾添加分隔符,并在inputStream.read()
循环中处理此分隔符。
您还可以指定邮件的长度,并在邮件开头附加长度。通常我们决定一种消息格式,我们坚持使用它。
即。 消息格式:
=========================================================
= Length (2 bytes) | Message =
=========================================================
您可能需要查看此链接
答案 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