android socket 发送大图片,数据丢失...求解决方案。。
现在是终端之间发送图片,类似微信之间发送图片那样,客户端把图片转化为字节流发给服务器上,然后服务器再找到要发送的人,把数据发给另外终端设备。现在在局域网两台模拟器上发送大图片,发送接收都没问题,部署到外网服务器上,服务器接收代码: int length = 0;
int totalNum = 0;
byte[] buffer = new byte[1024];
while ((length = dis.readInt()) != 0) {
length = dis.read(buffer, 0, length);
System.out.println("length :-------->" + length);
totalNum += length;
out.writeInt(length);
out.write(buffer, 0, length);
out.flush();
}
System.out.println("totalNum:-------->" + totalNum);
out.writeInt(0);
out.flush();
Debug.info("totalNum::::" + totalNum);
initService.getEnterpriseMsgService().save(msg);
每次接收1024个字节,有时候到System.out.println("length :-------->" + length);----直接为null,模拟器上每次发送和接收的数据是一致的,发送大图片就没这个问题。各位大神,求解决方案,是代码的问题,还是服务器的问题(公司的一台PC机,很卡的那种)。。。
[解决办法]
应该是代码的问题,理论上讲用socket的TCP不存在数椐丢失的问题.通常有这样的误区,发送方1k1k发,接收方1k1k的收,想当然就是1k一个包,是按包发送接收; 当网络捅挤的时,接收方一次响应收到的不一定是1k;可能是800;另外200在下一次响应中;所以应用流的概念来编程,而不是用包的概念;
[解决办法]
自己直接用socket传需要很好的底层设计,你不如直接用http协议这样的上层传简单些
[解决办法]
byte[] buffer;
if (size > 1024)
buffer = new byte[1024];
else
buffer = new byte[size];
发送端先把总长传过去,然后一直送
totalNum = 文件长;
dos.writeInt(totalNum);
while (totalNum > 0) {
length = ddis.read(buffer);
dos.write(buffer, 0, length);
dos.flush();
totalNum -= length;
}
接收端确定总长后,一直读,直到整个文件传送结束。
totalNum = dis.readInt();
while (totalNum > 0) {
length = dis.read(buffer, 0, 1024);
if(length > 0)
{
ddos.write(buffer, 0, length);
ddos.flush();
totalNum -= length;
}
}