Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.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
Android Java TCP客户端服务器文件传输_Android_Tcpclient - Fatal编程技术网

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

Android Java TCP客户端服务器文件传输,android,tcpclient,Android,Tcpclient,编辑* 我在客户端服务器上已成功运行。现在我正在两个模拟器之间进行文件传输。文件确实在模拟器之间传输,但我注意到接收到的文件大小与原始文件不同。例如,A.jpg大小为900KB,但收到的文件小于900KB。我检查了文件传输大小,发现传输时丢失了一些数据(字节)。这是怎么发生的 代码如下: 客户端(发送文件) 服务器(接收文件) *编辑2 当我浏览谷歌时,我发现.read(缓冲区)不能保证读取文件的完整大小(字节)。因此,接收到的文件总是会丢失一些字节(如空格、空字符)。要解决此问题,请先发送文件

编辑* 我在客户端服务器上已成功运行。现在我正在两个模拟器之间进行文件传输。文件确实在模拟器之间传输,但我注意到接收到的文件大小与原始文件不同。例如,A.jpg大小为900KB,但收到的文件小于900KB。我检查了文件传输大小,发现传输时丢失了一些数据(字节)。这是怎么发生的

代码如下:

客户端(发送文件)

服务器(接收文件)

*编辑2

当我浏览谷歌时,我发现.read(缓冲区)不能保证读取文件的完整大小(字节)。因此,接收到的文件总是会丢失一些字节(如空格、空字符)。要解决此问题,请先发送文件大小以通知接收者,然后才开始传输文件。

将告诉您错误所在


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

networkMainThreadException
发生是因为您必须使用


NullPointerException
发生的原因是您试图对套接字的结果使用
PrintWriter
。由于套接字没有任何内容,因此会出现此错误

在Android中,您不能在主线程上调用任何服务器操作。 在Android O.S 4.0及以上版本中,这将直接导致NetworkOnMainThreadException。您有两种选择:

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

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


我也遇到了这个例外,只有在操作系统版本高于4.0的设备上,所以你不能忽视Android的这些小需求。

谢谢你的建议。我已经完成了客户机-服务器部分,现在我在文件传输上遇到了问题,如上所述,你能看一下吗?再次感谢。请让em查看..:)您的图像在文件传输后是否完美,或者是否有任何问题,例如丢失了几个像素?图像的最后几行丢失了像素至少在logcat有任何警告?谢谢您的建议。我已经完成了客户机-服务器部分,现在我在文件传输上遇到了问题,如上所述,你能看一下吗?再次感谢你,谢谢你的建议。我已经完成了客户机-服务器部分,现在我在文件传输上遇到了问题,如上所述,你能看一下吗?再次感谢你。
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();