
AndroID上的代码:
Socket clIEnt = new Socket(ipStr,4444); OutputStream outputStream = clIEnt.getoutputStream(); fileinputStream fileinputStream = new fileinputStream(file); BufferedinputStream bufferedinputStream = new BufferedinputStream(fileinputStream); byte[] buffer = new byte[512]; byte[] sendLen = getBytes(file.length(),true); outputStream.write(sendLen); outputStream.flush(); int count; while ((count = fileinputStream.read(buffer)) > 0) { outputStream.write(buffer,count); } outputStream.flush(); bufferedinputStream.close(); outputStream.close(); clIEnt.close(); 服务器代码:
byte[] recvhead = new byte[8];inStream.read(recvhead,8);long recvLength = getLong(recvhead,false);fileOutputStream file = new fileOutputStream(filename,false);byte[] buffer = new byte[8192];int count = 0;while (count < recvLength) { int n = inStream.read(buffer); if(n == -1) break; file.write(buffer,n); count += n; } 但服务器将在读取(缓冲区)中阻塞(文件androID发送的大约是30M).
这是奇怪的事情:
当我在发送文件时向文件添加输出时,服务器可以正常工作.
fileOutputStream file2 = new fileOutputStream("/sdcard/testfile",false); while ((count = fileinputStream.read(buffer)) >= 0) { outputStream.write(buffer,count); outputStream.flush(); file2.write(buffer,count); file2.flush(); } 有人可以帮我这个吗?谢谢!
解决方法 你不能假设你读那样的8个长度字节.您可以在长度数组中读取少至一个字节.我会使用DatainputStream.readLong()来编写它,并使用DataOutputStream.writeLong()来编写它.或者,当你在一个文件后关闭时,完全删除长度字,直到EOS才读.其余的代码看起来还不错.如果接收器在read()中阻塞,则数据仍然存在,并且发送方仍在发送.
总结以上是内存溢出为你收集整理的Android客户端使用Socket发送大文件,服务器收到的文件不完整全部内容,希望文章能够帮你解决Android客户端使用Socket发送大文件,服务器收到的文件不完整所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)