DataOutputStream不发送-1

时间:2013-01-12 21:02:08

标签: java io chat send

我正在尝试为聊天客户端制作一个发送选项,我能够为小文件做这个,但是当我尝试用大文件时,我遇到了问题。我试图解决它的方式是: 客户端,从文件中读取并发送:

while ((buf = bin.read(bytearray, 0, bytearray.length)) != -1) {
     os.write(bytearray,0,bytearray.length);
}
bin.close();

“bin”是来自fileInputStream的bufferedInputStream,“buf”只是一个整数,os是我的DataOutputStream。 服务器端,接收和发送:

while ((buf = in.read(bytes, 0, bytes.length)) != -1) {
dos.write(bytes,0,bytes.length);
}

“in”是DataInputStream,“buf”是一个整数,“dos”是一个DataOutputStream(它为所有客户端执行此操作) 客户端,从服务器接收文件并写入硬盘:

int buf;
while ((buf = in.read(bytes, 0, bytes.length)) != -1) {
     fos.write(bytes,0,bytes.length);
}
fos.close();

这里“in”是DataInputStream,“fos”是FileOutputStream。当我点击第一个客户端上的发送按钮时,服务器和客户端都开始接收文件,但只有当我关闭第二个客户端(接收器)时才会收到它,因为那是在套接字关闭的时候,可能就是当它关闭时实际上决定停止接收并完成文件的写入。请告诉我为什么当发送执行一次并且dataInputStream在服务器中应为空并因此导致“-1”时它没有收到“-1”?

1 个答案:

答案 0 :(得分:2)

DataOutputStream 从不发送-1。当您关闭输出流时,底层传输向对等体发出EOS信号,并且遇到时由read()API返回为-1。电线上没有-1。如果不关闭输出流,则不会收到-1。

如果您希望阅读器在不关闭输出流的情况下停止阅读,则必须以某种方式将其作为应用程序协议的一部分进行说明:例如,在数据之前发送一个长度字,并让读者准确读取很多字节。