感觉是要设置缓冲区大小吧,感觉默认buffer的大小就一千多

解决方案 »

  1.   


    //  线程中的通讯码
    //  通讯方式为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);





            }  
      
        });  
      

  2.   

    mSocketClient.setReceiveBufferSize(8192);  //  接收缓冲大小 
    mSocketClient.setSendBufferSize(8192); 我设了8192 字节。。好象没生效。。
      

  3.   

    更正下    //  通讯方式为android 端发8字节命令字。服务器端(计算机)收到命令字后回传一个数据包//  通讯方式为android 端发16字节命令字。服务器端(计算机)收到命令字后回传一个数据包
      

  4.   

    mSocketClient.getReceiveBufferSize()  取回来是16384   
    回5楼。这是个测试程序,因为最终会用于android 手机和设备(单片机)之间通讯,所以不能用多线程多端口模式收发的。。
      

  5.   

    去掉 对接收内容的检查。。去掉屏幕上的对应通讯的消息显示。  速 度为 690K字节/秒     期望值是3--5M字节/秒。。差距有点大。
    以前玩VC转过来搞android 各种不适应啊。。