首页 新闻 会员 周边

Android socket发送数据巨慢,为什么?

0
悬赏园豆:40 [已关闭问题] 关闭于 2013-08-26 14:01

下面是本人在android平台下,socket绑定到OutputStream的wifi发送线程,发送速率巨慢。

Runnable SendTask = new Runnable() {

  @Override
  public void run() {
   while (!_sendThreadStop) {
    if (_commStatus) {
     if (_sendQueue.size() > 0) {
      MSG_NODE msg;
      try {
       msg = _sendQueue.take();   
       
       int left = 0;
       int size = 2048;
       while (left < msg.buffer.length) {
        if (msg.buffer.length - left < size) {
         size = msg.buffer.length - left;
        }
        _outStream.write(msg.buffer, left, size); 
        _outStream.flush();
        left+=size;
       }
       
       //_outStream.write(msg.buffer);  
       //_outStream.flush();
      } catch (InterruptedException e1) {
       e1.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
     }
     try {
      Thread.currentThread().sleep(20);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
  }
 };
 

上面程序定义:

public class MSG_NODE {
 byte[] buffer;
 int length;
 
 public MSG_NODE(byte[] buf, int length){
  this.buffer = buf;
  this.length = length;
 }
}

网络发送主要就是一句  _outStream.write(msg.buffer, left, size); 不知道为什么我手机通过wifi连接pc服务器传送165k的jpg文件,耗时30s。

已做如下排除:

1. pc服务器接收肯定没问题,也用了网口调试精灵测试,接收165k数据确实需要30s。

2. wifi网络应该也没问题,手机qq使用wifi上传至网络200k/s以上,局域网qq传700k/s,而我们的程序跑,不到6k/s。

3. socket发送缓冲区,查看了默认大致500k,设置成2m,效果一致。

4. 网络上很多程序,所谓的socket传文件,基本就是我这样的,创建socket,绑定到OutputStream,也试了使用别人的几个socket类,效果没有改善。

5. 本人发送、接收、数据处理都是独立线程。实验了只开启发送线程,其他接收、处理等线程停掉,效果还是165k耗时30s。

6. outputStream.write(buf),本人程序是一次性加载文件到buf里,再发送。尝试了每次读取文件1k,再发送,效果一致。尝试过把读进的165k数据,每次write只发1-2k,效果一致。

7. 试过网络上简单的NIO类,效果一致。

8. 把此通信模块添加到java工程,在pc机上跑,发送165k只需要1-2s。

9. 测试过发送数据包不进多线程同步的队列,就发送一个165k的包,效果一致。

10. 执行outputStream.write(buf)一句本身耗时非常小,ms级。

 

我的程序问题到底在哪?为什么qq一些软件就不会出现这个问题?

fyhui的主页 fyhui | 初学一级 | 园豆:149
提问于:2013-08-16 20:19
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册