【发布时间】:2012-09-02 18:00:49
【问题描述】:
我有几个问题-
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方法)
【问题讨论】:
-
您真的不应该使用
available来确定要读取多少bytes。available的某些实现将始终返回0,然后您的代码将无法工作。只需尝试完全填满缓冲区并检查read的返回值,看看实际读取了多少bytes。 -
while(serverInputStream.read(eatup,0,available)!=-1); -
@Jeffrey 但是如果我为此目的使用
read方法,当没有字节可读取时,程序将阻塞(文档是这样说的),这是我不想要的。 -
@Jisean - 如果您需要在接收端检测“消息结束”而不关闭连接,那么您需要构建一个基本的消息协议。请参阅我的答案以获取示例(大小前缀)
-
@JisanMahmud 你为什么要丢弃
InputStream上的已有数据?
标签: java stream inputstream outputstream