套接字的InputStream无法正确读取字节

时间:2019-07-23 14:59:20

标签: java sockets network-programming

我正在使用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

FINCOMING_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,将破坏整个协议。

我不知道发生了什么,为什么不起作用。任何线索表示赞赏。谢谢!

0 个答案:

没有答案