java - DataOutputStream 不发送 -1

标签 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。发生的情况是,当我点击第一个客户端上的发送按钮时,服务器和客户端都开始接收文件,但只有当我关闭第二个客户端(接收器)时才会收到文件,因为那是套接字关闭的时间,可能就是它的时间实际上决定停止接收并完成写入文件。请告诉我为什么当发送执行一次时它没有收到“-1”并且服务器中的dataInputStream应该为空并因此导致“-1”?

最佳答案

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

如果您希望阅读器在不关闭输出流的情况下停止阅读,您必须以某种方式告诉它作为应用程序协议(protocol)的一部分:例如,在数据之前发送一个长度字,并让阅读器准确地阅读该内容很多字节。

关于java - DataOutputStream 不发送 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14297923/

相关文章:

java - 如何创建一个一旦调用就不能再次调用的 Java 函数,除非有一些延迟?

io - IO口地址分配是CPU、BIOS还是OS做的?

Java servlet 和 IO : Create a file without saving to disk and sending it to the user

macos - 饼图库

html - 当用户单击链接时开始 Viber 聊天

ios - UIView 自动向上 - 当从 TabbarController 推送时

java - Tomcat 已启动但未创建数据库表且本地主机为 :8080 shows "HTTP Status 404"

java - Java Audio-播放具有立体声功能的WAV文件

java - MainSoft Grasshopper,.Net 到 Java

python - 如果我没有初始化文件,如何关闭它?