我在通过套接字传输文件时遇到问题。 我写了一个简单的客户端/服务器应用程序,客户端截取屏幕截图并将其发送到服务器。 问题是文件没有完成,无论我做什么,它总是丢失数组中的第一个字节,使照片损坏。 当我在任何十六进制编辑器中打开照片并将原始照片与客户端发送的照片进行比较时,我可以看到丢失的字节,就像我添加它一样,照片打开没有问题。发送文件的大小只丢失一个字节! 这是问题的照片:
原始照片
以下是代码:
服务器(接收方):
byte[] buf;
InputStream inp;
try (BufferedOutputStream out1 = new BufferedOutputStream(new FileOutputStream(new File("final.jpeg")))) {
buf = new byte[s.getReceiveBufferSize()];
inp = new DataInputStream(s.getInputStream());
Thread.sleep(200);
int len = 0;
while ((len = inp.read(buf)) >0){
out1.write(buf,0,len);
}
out1.flush();
inp.close();
out1.close();
}
客户(发件人):
BufferedImage screenshot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(screenshot, "jpeg", os);
ImageIO.write(screenshot, "jpeg", new File("test.jpeg"));
OutputStream out = new BufferedOutputStream( connection.getOutputStream());
out.write(os.toByteArray());
out.close();
我尝试使用与收到数据相同的方式发送数组,但没有锁定。我试过了,没有缓冲,我已经尝试了双方冲洗,我试图关闭Nod杀毒软件,在发送长度时尝试睡眠, 我几乎没有成功地尝试过一切。 我试过两个,我的电脑和虚拟机Windows 7! 任何帮助将不胜感激。
答案 0 :(得分:1)
请注意,DataInputStream
通过从-1
返回值read()
来表示流的结束,因此您的服务器读取循环应如下所示:
while ((len = inp.read(buf)) != -1){
out1.write(buf,0,len);
}
也许这有帮助。
答案 1 :(得分:1)
您发布的代码不会丢失数据。在执行您发布的服务器代码之前的某个地方,您已经执行了一个InputStream.read()
个字节,可能是误导性的尝试,以测试流的结束。
睡眠只是浪费时间。去掉它。您也不需要DataInput/OutputStreams
。
答案 2 :(得分:0)
客户端代码看起来很好。必须是服务器。您只在“某些”输入流写入文件时发布了该部件。之前发生了什么?有人在输入流上做了read()吗?
很抱歉在“回答”部分写这个。显然,我还不能发表评论。
答案 3 :(得分:0)
好的,这是我的错!我在服务器端寻找错误但是错误在客户端!我打开一个DataInputStream来读取来自服务器的订单而不关闭它,这就是问题所在。