android socket 发送大图片,数据丢掉.求解决方案。
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协议这样的上层传简单些
------解决方案--------------------
我知道原因,我也遇到过,,,,
1024 太大了,如果图片小于1024 你就直接读到后面的了。。。。
size是文件的大小。。。。
------解决方案--------------------
还是老毛病;length = dis.read(buffer, 0, length); 这时想读和实际读取的数椐不一定一致;你换个参数名打印出来试试.
另外,你中间插入的int几乎没有作用,且可能读到buffer里面去,建议不要。
现在是终端之间发送图片,类似微信之间发送图片那样,客户端把图片转化为字节流发给服务器上,然后服务器再找到要发送的人,把数据发给另外终端设备。现在在局域网两台模拟器上发送大图片,发送接收都没问题,部署到外网服务器上,服务器接收代码: 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协议这样的上层传简单些
------解决方案--------------------
我知道原因,我也遇到过,,,,
1024 太大了,如果图片小于1024 你就直接读到后面的了。。。。
size是文件的大小。。。。
byte[] buffer;
if (size > 1024)
buffer = new byte[1024];
else
buffer = new byte[size];
------解决方案--------------------
还是老毛病;length = dis.read(buffer, 0, length); 这时想读和实际读取的数椐不一定一致;你换个参数名打印出来试试.
另外,你中间插入的int几乎没有作用,且可能读到buffer里面去,建议不要。
发送端先把总长传过去,然后一直送
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();