我正在使用Java Socket类开发聊天应用程序。此应用程序必须支持检测从服务器发送到客户端的不同类型的消息,以便客户端从服务器发送的以下字节中知道期望什么。
我所做的是,每当服务器向客户端发送数据时,服务器将首先发送1个字节,该字节将告诉客户端接下来将发送什么数据。看起来像这样:
worker.getServerOutputStream().write(INCOMING_PRIVATE_SERVER_MESSAGE);
worker.getServerOutputStream().flush();
worker.getServerWriter().println(message);
worker.getServerWriter().flush();
此代码是执行向客户端发送“专用服务器消息”的操作的功能的摘要(例如,服务器告知客户端3分钟内将关闭服务器)。 INCOMING_PRIVATE_SERVER_MESSAGE
只是一些值的byte
。
故事的客户端很简单:客户端将等待单个byte
标志,并简单地检查接收到哪个标志。知道收到了哪个标志,客户将知道期望什么和做什么:
int flag = clientSocket.getInputStream().read();
if(flag == -1) {
clientReader.close();
clientSocket.close();
break;
}
if(flag == Server.INCOMING_PRIVATE_CLIENT_MESSAGE) {
String sender = clientReader.readLine();
String receiver = clientReader.readLine();
String message = clientReader.readLine();
// Do something with sender, receiver and message...
} else if(flag == Server.INCOMING_PRIVATE_SERVER_MESSAGE) {
String message = clientReader.readLine();
// Do something with message...
...
示例:
服务器端:
如果服务器要向客户端发送3条私有“ HelloWorld”消息,则服务器将向输出流写入以下内容:
FHelloWorld\r\nFHelloWorld\r\nFHelloWorld
F
是INCOMING_PRIVATE_SERVER_MESSAGE
标志的地方。
或在代码中
// Perform this 3 times to send 3 "HelloWorld" messages to the client.
worker.getServerOutputStream().write(INCOMING_PRIVATE_SERVER_MESSAGE);
worker.getServerOutputStream().flush();
worker.getServerWriter().println("HelloWorld");
worker.getServerWriter().flush();
客户端:
int flag = clientSocket.getInputStream().read(); // Wait for the flag.
客户端读取第一个F
标志。
客户端检查它是哪个标志
if(flag == INCOMING_PRIVATE_SERVER_MESSAGE) ...
客户端知道私人服务器消息是传入的,读取该消息并对接收到的消息执行某些操作:
String message = clientReader.readLine();
// Do something with message...
那是什么问题?
客户端输入流有时可能无法正确读取该标志,否则客户端读取器将不读取HelloWorld
并与其一起读取该标志,因此读取的消息将为FHelloWorld
,将破坏整个协议。
我不知道发生了什么,为什么不起作用。任何线索表示赞赏。谢谢!