【问题标题】:Android Java TCP Client Server File TransferAndroid Java TCP 客户端服务器文件传输
【发布时间】:2013-01-17 12:40:30
【问题描述】:

编辑* 我在客户端服务器上成功了。现在我正在两个模拟器之间传输文件。该文件确实在模拟器之间传输,但我注意到收到的文件大小与原始文件不同。例如,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) 并不能保证读取文件的完整大小(字节)。因此,接收到的文件总是丢失一些字节(如空格、空字符)。要解决这个问题,先发送文件大小通知接收方,然后才开始传输文件。

【问题讨论】:

    标签: android tcpclient


    【解决方案1】:

    NetworkOnMainThreadException 出现是因为你必须使用AsyncTask

    NullPointerException 发生是因为您尝试将PrintWriter 与 Sockets 的结果一起使用。由于您对 Sockets 一无所知,因此您会收到此错误。

    【讨论】:

    • 感谢您的建议。我已经完成了客​​户端-服务器部分,现在我在文件传输方面遇到问题,如上所述,您可以看看吗?再次感谢您。
    • 一定让他们看看..:)
    • 您的图像在文件传输后是否完美或有丢失几个像素等问题?
    • 图片最后几行丢失像素
    • 至少在 logcat 有任何警告吗?
    【解决方案2】:

    NetworkOnMainThreadException 告诉你你做错了什么。

    您需要将网络内容放入单独的线程(或AsyncTask 或类似的)。

    【讨论】:

    • 感谢您的建议。我已经完成了客​​户端-服务器部分,现在我在文件传输方面遇到问题,如上所述,您可以看看吗?再次感谢您。
    【解决方案3】:

    您不能在 Android 的主线程上调用任何服务器操作。 在 Android OS 4.0 及更高版本中,这将直接导致 NetworkOnMainThreadException。你有两个选择:

    1) 使用 AsyncTask 调用您的每个服务器操作。

    2) 或使用用户定义的线程进行任何类型的服务器操作。

    我也在为这个异常而苦苦挣扎,只在4.0以上的OS版本的设备中,所以你不能忽视Android的这些小需求。

    【讨论】:

    • 感谢您的建议。我已经完成了客​​户端-服务器部分,现在我在文件传输方面遇到问题,如上所述,您可以看看吗?再次感谢您。
    猜你喜欢
    • 2023-03-21
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多