如何在达到某个字节之前读取java流
发布时间:2020-12-15 08:35:03 所属栏目:Java 来源:网络整理
导读:我的问题与这篇文章类似.但是我不会发送数据包长度而不是最后一个0字节. Most efficient way to read in a tcp stream in Java 所以我想知道我将如何编写代码. 目前我只是使用 this.socketIn = new BufferedReader(new InputStreamReader(this.socket.getInp
我的问题与这篇文章类似.但是我不会发送数据包长度而不是最后一个0字节.
Most efficient way to read in a tcp stream in Java 所以我想知道我将如何编写代码. 目前我只是使用 this.socketIn = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); String line = this.socketIn.readLine(); 如果在您发送数据包时发送数据包,它将计算尚未作为完全读取线路到达的数据包,但它不完整并且会弄乱整个协议. 在我的协议中,每个数据包以0字节(0x00)结束,以确定单个数据包的结束(如果数据包最终合并/堆叠在一起). 所以我真正要做的就是继续读取套接字流,直到达到0x00表示数据包已经完全制作并准备好进行处理..当然还有某种安全性(我认为超时是最好的)来确定数据包是垃圾,因为它没有在特定时间帧的0字节中结束,比如5秒. 我该怎么做呢? P.S> 这是我到目前为止所尝试的. 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 } 解决方法
这是使用setSocketTimeout处理“慢客户端/拒绝服务”场景的草图.
this.socket.setSoTimeout(5000); BufferedReader br = new BufferedReader( new InputStreamReader(this.socket.getInputStream())); StringBuilder sb = new StringBuilder(); try { int ch ; while ((ch == br.read()) != -1) { if (ch == 0) { String message = sb.toString(); // process message sb.setLength(0); } else { sb.append((char) ch); } } } catch (InterruptedIOException ex) { System.err.println("timeout!"); ... } finally { br.close(); } 我认为也可以通过创建第二个线程来实现(残酷的)套接字超时,如果它检测到读取线程没有获取任何数据,则在套接字对象上调用socket.close().但考虑到更简单的setSoTimeout()方法,这是一种重量级的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |