Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DataOutputStream不';t发送-1_Java_Io_Chat_Send - Fatal编程技术网

Java DataOutputStream不';t发送-1

Java DataOutputStream不';t发送-1,java,io,chat,send,Java,Io,Chat,Send,我正在尝试为聊天客户机创建一个发送选项,我可以为小文件创建发送选项,但是当我尝试为大文件创建发送选项时,遇到了一个问题。我试图解决这个问题的方法是: 客户端,从文件读取并发送: while ((buf = bin.read(bytearray, 0, bytearray.length)) != -1) { os.write(bytearray,0,bytearray.length); } bin.close(); while ((buf = in.read(bytes, 0, byt

我正在尝试为聊天客户机创建一个发送选项,我可以为小文件创建发送选项,但是当我尝试为大文件创建发送选项时,遇到了一个问题。我试图解决这个问题的方法是: 客户端,从文件读取并发送:

while ((buf = bin.read(bytearray, 0, bytearray.length)) != -1) {
     os.write(bytearray,0,bytearray.length);
}
bin.close();
while ((buf = in.read(bytes, 0, bytes.length)) != -1) {
dos.write(bytes,0,bytes.length);
}
“bin”是来自fileInputStream的bufferedInputStream,“buf”只是一个整数,os是我的DataOutputStream。 服务器端,接收和发送:

while ((buf = bin.read(bytearray, 0, bytearray.length)) != -1) {
     os.write(bytearray,0,bytearray.length);
}
bin.close();
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”是数据输入流,“fos”是文件输出流。当我在第一个客户机上点击send按钮时,服务器和客户机都开始接收文件,但只有当我关闭第二个客户机(接收器)时,它才会被接收,因为那是套接字关闭的时候,可能是它决定停止接收并完成文件写入的时候。请告诉我,当发送执行一次且服务器中的dataInputStream应为空时,它为什么不接收“-1”,从而导致“-1”?

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


如果希望读卡器在不关闭输出流的情况下停止读取,则作为应用程序协议的一部分,您必须以某种方式告诉它:例如,在数据之前发送一个长度字,并让读卡器精确读取那么多字节。

除了上一个代码段,您似乎没有关闭任何输出流。哪个方法/对象应返回-1?我不会关闭输出流,因为如果关闭,我的套接字也将关闭,聊天客户端将断开连接。@Martin但是客户端如何知道文件的结尾在哪里?如果无法关闭流,则应首先发送(并读取)文件长度为
long
,然后从流中读取那么多字节。我希望发送文件的客户端(第一个客户端)在发送完最后一个字节后,服务器尝试读取一个字节,该字节不应该有,我认为应该得到buf=-1;