下面是本人在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一些软件就不会出现这个问题?