android_socket_速度只有560K字节/秒 感觉是要设置缓冲区大小吧,感觉默认buffer的大小就一千多 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // 线程中的通讯码// 通讯方式为android 端发8字节命令字。服务器端(计算机)收到命令字后回传一个数据包。// send_length---数据包长度 字节// test_chi ----重复通讯次数 ---10000次后停下 private Thread myThread = new Thread(new Runnable() { @Override public void run() { try { // 连接服务器 mSocketClient = new Socket(nect_IP, PORT); mSocketClient.setReceiveBufferSize(8192); // 接收缓冲大小 mSocketClient.setSendBufferSize(8192); mSocketClient.setSoTimeout(2000); // 2秒超时 // 取得输入、输出流 out = mSocketClient.getOutputStream(); get = mSocketClient.getInputStream(); } catch (Exception e) { recvMessageClient = "连接IP异常:" + e.toString() + e.getMessage() + "\n"; // 消息换行 Message msg = new Message(); msg.what = 2; myHandler.sendMessage(msg); isConnecting = false; return; } isConnecting = true; ss = "创建连接成功..."; Log.i( ss, "warn" ); byte[] w_buffer = new byte[16]; // 发送缓冲 int i; int chi=0; ms_before = System.currentTimeMillis(); ms_first = ms_before; rec_num = 0; while (isConnecting) { ss=" "; if(rec_num>=test_chi) // 达到预定通讯次数时,停止 { // 发送停止位 153 for(i=0;i<16;i++) // 清空命令缓冲区 w_buffer[i]=0; w_buffer[0]= (byte)153; w_buffer[1]=0; try { out.write(w_buffer,0,16);// 发送16字节 命令字 out.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } ss = "发送停命令字..."; Log.i( ss, "warn" ); Message msg = new Message(); // 通知停止 msg.what = 3; myHandler.sendMessage(msg); break; } try { for(i=0;i<16;i++) // 清空命令缓冲区 w_buffer[i]=0; w_buffer[0]= 17; w_buffer[1]=17; // 17--- 取数命令字 w_buffer[2]= (byte)(send_length%256); // 通知服务端数据包长度为 send_length w_buffer[3]= (byte)(send_length/256); // w_buffer[4]= (byte)(send_length/256/256);// w_buffer[5]= (byte)(send_length/256/256/256);// out.write(w_buffer,0,16); out.flush(); ss=" "; // 清空读缓冲区 for(i=0;i<send_length;i++) // 清空缓冲区 t_buffer[i]=0; int tem,zong; zong =0; chi=0; while( zong< send_length { if(get.available()>0 ) { tem = get.read(t_buffer); // 读取数据 if(tem>0) zong = tem+zong; if(tem==-1) // 流结束 { ss="流结束 "; Log.i( ss, "warn" ); break; } } chi++; if(chi>10000) // 超时判断 { Message msg = new Message(); msg.what = 9; myHandler.sendMessage(msg); break; } // Thread.sleep(1); // } if(zong>=send_length ) { rec_num++; if(rec_num%time_view==0 ||rec_num==test_chi )// 每 time_view 次显示一次 { Message msg = new Message(); msg.what = 1; myHandler.sendMessage(msg); } // 检查接收内容正确性 for(i=0;i<send_length;i++)// { s_zi = getshort( t_buffer[i] ); if(s_zi != i%256) { // 接收内容不对 rec_leng = zong; erro_num++; Message msg = new Message(); msg.what = 4; myHandler.sendMessage(msg); break; } } } // Thread.sleep(1); } catch (Exception e) { recvMessageClient = "接收异常:" + e.getMessage() + "\n";//消息换行 Message msg = new Message(); msg.what = 0; myHandler.sendMessage(msg); break; } } // 当退出时 // 发送停止位 0x99---153 for(i=0;i<16;i++) // 清空命令缓冲区 w_buffer[i]=0; w_buffer[0]= (byte)153; w_buffer[1]=0; try { out.write(w_buffer,0,16);// 发送16字节 命令字 out.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } Message msg = new Message(); // 通知停止 msg.what = 3; myHandler.sendMessage(msg); } }); mSocketClient.setReceiveBufferSize(8192); // 接收缓冲大小 mSocketClient.setSendBufferSize(8192); 我设了8192 字节。。好象没生效。。 更正下 // 通讯方式为android 端发8字节命令字。服务器端(计算机)收到命令字后回传一个数据包// 通讯方式为android 端发16字节命令字。服务器端(计算机)收到命令字后回传一个数据包 mSocketClient.getReceiveBufferSize() 取回来是16384 回5楼。这是个测试程序,因为最终会用于android 手机和设备(单片机)之间通讯,所以不能用多线程多端口模式收发的。。 去掉 对接收内容的检查。。去掉屏幕上的对应通讯的消息显示。 速 度为 690K字节/秒 期望值是3--5M字节/秒。。差距有点大。以前玩VC转过来搞android 各种不适应啊。。 SQLite如何按照拼音排序呢? 开发的输入法在模拟器上调试能用,在真机上不能,怎么回事 android中使用sqlite3执行SQL语句的问题!! 请教问题,希望高手给一个思路,关于后台定时读数,前台弹窗的问题。 Spinner setOnClickListener()报错 100分询问 AppWidget 上如果实现一张图片渐缩放的效果 android程序实例化问题 Activity以Dialog形式弹出后怎么设置右对齐 请问 如何在android启动中加载我自己设计的so文件 Android项目现场直播 关于对话框Builder的问题 bluestacks模拟器运行时占多少内存?
// 线程中的通讯码
// 通讯方式为android 端发8字节命令字。服务器端(计算机)收到命令字后回传一个数据包。// send_length---数据包长度 字节
// test_chi ----重复通讯次数 ---10000次后停下
private Thread myThread = new Thread(new Runnable() {
@Override
public void run() {
try
{
// 连接服务器
mSocketClient = new Socket(nect_IP, PORT);
mSocketClient.setReceiveBufferSize(8192); // 接收缓冲大小
mSocketClient.setSendBufferSize(8192);
mSocketClient.setSoTimeout(2000); // 2秒超时
// 取得输入、输出流
out = mSocketClient.getOutputStream();
get = mSocketClient.getInputStream();
}
catch (Exception e)
{
recvMessageClient = "连接IP异常:" + e.toString() + e.getMessage() + "\n"; // 消息换行
Message msg = new Message();
msg.what = 2;
myHandler.sendMessage(msg);
isConnecting = false;
return;
}
isConnecting = true;
ss = "创建连接成功...";
Log.i( ss, "warn" );
byte[] w_buffer = new byte[16]; // 发送缓冲
int i;
int chi=0; ms_before = System.currentTimeMillis();
ms_first = ms_before;
rec_num = 0;
while (isConnecting)
{
ss=" ";
if(rec_num>=test_chi) // 达到预定通讯次数时,停止
{
// 发送停止位 153
for(i=0;i<16;i++) // 清空命令缓冲区
w_buffer[i]=0;
w_buffer[0]= (byte)153;
w_buffer[1]=0;
try {
out.write(w_buffer,0,16);// 发送16字节 命令字
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
ss = "发送停命令字...";
Log.i( ss, "warn" );
Message msg = new Message(); // 通知停止
msg.what = 3;
myHandler.sendMessage(msg);
break;
}
try
{
for(i=0;i<16;i++) // 清空命令缓冲区
w_buffer[i]=0;
w_buffer[0]= 17; w_buffer[1]=17; // 17--- 取数命令字
w_buffer[2]= (byte)(send_length%256); // 通知服务端数据包长度为 send_length
w_buffer[3]= (byte)(send_length/256); //
w_buffer[4]= (byte)(send_length/256/256);//
w_buffer[5]= (byte)(send_length/256/256/256);//
out.write(w_buffer,0,16);
out.flush();
ss=" ";
// 清空读缓冲区
for(i=0;i<send_length;i++) // 清空缓冲区
t_buffer[i]=0;
int tem,zong;
zong =0;
chi=0;
while( zong< send_length
{
if(get.available()>0 )
{
tem = get.read(t_buffer); // 读取数据
if(tem>0)
zong = tem+zong;
if(tem==-1) // 流结束
{
ss="流结束 ";
Log.i( ss, "warn" );
break;
}
}
chi++;
if(chi>10000) // 超时判断
{
Message msg = new Message();
msg.what = 9;
myHandler.sendMessage(msg);
break;
}
// Thread.sleep(1); //
}
if(zong>=send_length )
{
rec_num++;
if(rec_num%time_view==0 ||rec_num==test_chi )// 每 time_view 次显示一次
{
Message msg = new Message();
msg.what = 1;
myHandler.sendMessage(msg);
}
// 检查接收内容正确性
for(i=0;i<send_length;i++)//
{
s_zi = getshort( t_buffer[i] );
if(s_zi != i%256)
{ // 接收内容不对
rec_leng = zong;
erro_num++;
Message msg = new Message();
msg.what = 4;
myHandler.sendMessage(msg);
break;
}
}
}
// Thread.sleep(1);
}
catch (Exception e)
{
recvMessageClient = "接收异常:" + e.getMessage() + "\n";//消息换行
Message msg = new Message();
msg.what = 0;
myHandler.sendMessage(msg);
break;
}
}
// 当退出时
// 发送停止位 0x99---153
for(i=0;i<16;i++) // 清空命令缓冲区
w_buffer[i]=0;
w_buffer[0]= (byte)153;
w_buffer[1]=0;
try {
out.write(w_buffer,0,16);// 发送16字节 命令字
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
Message msg = new Message(); // 通知停止
msg.what = 3;
myHandler.sendMessage(msg);
}
});
mSocketClient.setSendBufferSize(8192); 我设了8192 字节。。好象没生效。。
回5楼。这是个测试程序,因为最终会用于android 手机和设备(单片机)之间通讯,所以不能用多线程多端口模式收发的。。
以前玩VC转过来搞android 各种不适应啊。。