我的问题与这篇文章类似。但我最后不发送数据包长度,而是一个 0 字节。 在 Java 中读取 tcp 流的最有效方法
所以我想知道我将如何编写一些代码。
目前我只是使用
this.socketIn = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
String line = this.socketIn.readLine();
如果在您向数据包发送垃圾邮件时发送数据包,它将将尚未到达的数据包计为完全读取的行,但它是不完整的并且会弄乱整个协议。
在我的协议中,如果数据包最终合并/堆叠在一起,每个数据包都以 0 字节 (0x00) 结束,以确定单个数据包的结尾。
所以我真正想做的是继续读取套接字流,直到达到 0x00 以指示数据包已完全制作并准备好处理..当然还有某种安全性(我相信最好是超时)来确定数据包是垃圾,因为它在特定时间范围内没有以 0 字节结束,比如说 5 秒。
我该怎么做呢?
PS> 我没有使用 NIO 框架,而只是每个连接套接字的常规线程,我不想切换到 NIO,因为很难使用完全不同的全局线程注入数据,该线程处理更新并将特定更新发送给随机用户(不广播)。
这是我到目前为止所尝试的。
String line = "";
int read;
long timeOut = System.currentTimeMillis();
while(true) {
read = this.socketIn.read();
if (read == -1 || read == 0 || (System.currentTimeMillis()-timeOut) > 5000)
break;
line += read
}