- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个问题-
1. 我有两台通过套接字连接的计算机。当程序执行时
outputStream.writeInt(value);
outputStream.flush();
究竟发生了什么?程序是否等到另一台计算机读取整数值?
2. 如何清空outputStream
或inputStream
?意思是,清空时outputStream
或 inputStream
,写入该流的任何内容都会被删除。(请不要建议通过关闭连接来做到这一点!)我试图用这种方式清空 inputStream
-
byte[] eatup=new byte[20*1024];
int available=0;
while(true)
{
available=serverInputStream.available();
if(available==0)
break;
serverInputStream.read(eatup,0,available);
}
eatup=null;
String fileName=(String)serverInputStream.readObject();
程序不应处理该行,因为 outputStream
上没有写入任何其他内容。但是我的程序无论如何都会执行它并抛出一个 java.io.OptionalDataException
错误。
注意:我正在从事客户端-服务器文件传输项目。客户端发送文件到服务器。第二个代码用于服务器终端。如果在服务器上按下“取消按钮”结束然后它停止从 serverInputStream
读取字节并发送一个信号(我使用 int
-1)给客户。当客户端收到此信号时,它会停止向服务器发送数据,但我已经注意到 serverInputStream
不为空。所以我需要清空这个 serverInputStream
以便客户端计算机能够再次发送服务器计算机文件(这就是我无法管理锁的原因来自 read
方法)
最佳答案
1 - 否。在 flush() 上,数据将写入操作系统内核,操作系统内核可能会立即将其交给网卡驱动程序,网卡驱动程序又会将其发送到接收端。简而言之,发送即是即发即忘。
2 - 正如 Jeffrey 评论的那样,available() 对于这种操作来说并不可靠。如果执行阻塞 IO,那么正如他所建议的那样,您应该推测性地使用 read()。然而,应该说你确实需要在原始流之上定义一个协议(protocol),即使它只是使用 DataInput/DataOutputStream。使用原始写入/读取时,黄金法则是一次写入!=一次读取。例如,如果您要在一侧写入 10 个字节,而在另一侧有一个读取循环,则无法保证一次读取将读取所有 10 个字节。它可以作为 block 的任意组合被“读取”。类似地,两次 10 字节的写入在接收端可能显示为一次 20 字节的读取。换句话说,没有“数据包”的概念,除非您在原始字节之上创建更高级别的协议(protocol)来处理数据包。例如,每次发送都以字节长度为前缀,以便接收方知道当前数据包中需要多少数据。
如果您确实需要做比基本应用程序更复杂的事情,我强烈建议您研究一些更高级别的库,这些库已经解决了网络 IO 的许多棘手问题。我会推荐Netty我用于生产应用程序。然而,从简单的 IO 流到 Netty 的更多基于事件的系统的理解是一个很大的飞跃。中间某处可能还有其他库。
关于Java : BufferdInputStream and BufferedOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238426/
我有几个问题- 1. 我有两台通过套接字连接的计算机。当程序执行时 outputStream.writeInt(value); outputStream.flush(); 究竟发生了什么?程序是否等到
我是一名优秀的程序员,十分优秀!