安卓Java TCP客户端服务器文件传输

3
编辑* 我已经在客户端服务器上成功操作。现在我正在两个模拟器之间进行文件传输。文件确实在模拟器之间传输了,但我注意到接收到的文件大小不同于原始文件。例如,A.jpg的大小为900KB,但是接收到的文件大小小于900KB。我检查了文件传输大小,并发现在传输时有一些数据(字节)丢失了。这是怎么发生的?
以下是代码:
客户端(发送文件)
File myFile = new File ("/mnt/sdcard/Pictures/A.jpg");
FileInputStream fis = new FileInputStream(myFile);
OutputStream os = socket.getOutputStream();
int filesize = (int) myFile.length();

byte [] buffer  = new byte [filesize];
     int bytesRead =0;
     while ((bytesRead = fis.read(buffer)) > 0) {
     os.write(buffer, 0, bytesRead);
//Log display exact the file size
     System.out.println("SO sendFile" + bytesRead);
     }
     os.flush();
     os.close();
     fis.close();
     Log.d("Client", "Client sent message");
     socket.close();

服务器(接收文件)

FileOutputStream fos = new FileOutputStream("/mnt/sdcard/Pictures/B.jpg");
@SuppressWarnings("resource")
BufferedOutputStream bos = new BufferedOutputStream(fos);
InputStream is = clientSocket.getInputStream();

byte[] aByte = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(aByte)) != -1) 
{
     bos.write(aByte, 0, bytesRead);
//Log display few parts the file size is less than 1024. I total up, the lost size caused the file received is incomplete
     System.out.println("SO sendFile" + bytesRead);
 }
clientSocket.close();

*编辑2

我在谷歌上搜索的时候发现,.read(buffer)不能保证读取整个文件的字节大小。因此,接收到的文件总是会丢失一些字节(比如空格、空字符)。为了解决这个问题,先发送文件大小通知接收方,然后才开始传输文件。

3个回答

1

NetworkOnMainThreadException 的出现是因为您需要使用AsyncTask

NullPointerException 的出现是因为您正在尝试使用PrintWriter与Sockets的结果。由于您没有得到任何关于Sockets的内容,因此会出现此错误。


谢谢建议。我已经完成了客户端和服务器端部分,现在我遇到了文件传输的问题,如上所述,您能帮忙看一下吗?再次感谢。 - Hikari Gan Kong Fei
当然,让我看看它.. :) - Vinay
文件传输后,您的图像是否完美无缺,或者出现了像素丢失等问题? - Vinay
图像的最后几行丢失了像素。 - Hikari Gan Kong Fei
日志中至少有警告吗? - Vinay
显示剩余3条评论

0

NetworkOnMainThreadException 告诉你你正在做错什么。

你需要将网络相关的操作放入单独的线程中(或使用AsyncTask或类似方案)。


谢谢您的建议。我已经完成了客户端和服务器端部分,现在我在文件传输方面遇到了问题,正如上面所说,您能帮忙看一下吗?再次感谢您。 - Hikari Gan Kong Fei

0
在Android中,不能在主线程上调用任何服务器操作。
在Android O.S 4.0及以上版本中,这将直接导致NetworkOnMainThreadException异常。你有两个选择:
1)要么使用AsyncTask来调用每个服务器操作。
2)要么为任何类型的服务器操作使用用户定义的线程
我也曾经为这个异常苦苦挣扎,只有在4.0以上设备的操作系统版本中才会出现,所以你不能忽视Android的这些小需求。

谢谢您的建议。我已完成客户端-服务器部分,现在我在文件传输方面遇到了问题,如上所述,您可以看一下吗?再次感谢您。 - Hikari Gan Kong Fei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接