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