本帖最后由 qiuqingpo 于 2010-08-27 11:36:14 编辑

解决方案 »

  1.   

    同步发送试试;不太喜欢C#的socket,感觉用起来不爽;
      

  2.   

    DealData(readbuffer);
    是干什么的?干嘛要先把数据复制到readbuffer多此一举?
      

  3.   

    跟你说点有用的吧!当网络很差(或者如你的测试压力)时,socket的缓冲区不一定有那么多数据。所以你可以补充以下简单的协议,例如每一个消息的最后必须是ascii码“sp1234”对应的这样6个字节。然后,当你的if (client.Available <= 0)判断内部,还要判断是否 state.buffer 恰好是这6个字节结尾,如果是才认为消息结束,当不符合的时候不要调用处理“信息包结束”的方法。这样可以避免错误调用这个方法。实际上,这段代码透露出你有滥用try...catch....的习惯。这样,明明是处理信息包时出现异常,也被你用来误导别人(和自己)说“没有收到信息包”。滥用try...catch....就会让调试和迅速定位问题变得异常困难,所以最好不要滥写try...catch.....,异常应该在应用系统的最高层(表现层,对于客户端就是application,对于服务就是通讯命令执行层)去捕获和统一处理,在深层不要滥用try...catch....。
      

  4.   


            private void ReceiveCallBack(IAsyncResult ar)
            {
                //从输入参数异步state对象中获取state和socket对象
                StateObject state = (StateObject)ar.AsyncState;
                Socket client = state.worksocket;
                //从远程设备读取数据
                int bytesRead = client.EndReceive(ar);
                if (bytesRead == 0)
                {
                    Close();
                    return;
                }
                if (client.Available <= 0)
                {
                     DealData(state.buffer);
                }
                client.BeginReceive(state.buffer, 0, StateObject.buffersize, 0, new AsyncCallback(ReceiveCallBack), state);
            }
     private void DealData(byte[] bytes)
            {
                if (bytes.Length >= 12)
                {
                    byte[] buffer = null;
                    buffer = new byte[12];
                    Buffer.BlockCopy(bytes, 0, buffer, 0, 12);
                    MessageHeader head = new MessageHeader(buffer);
                    int MsgLen = (int)head.Total_Length;
                    if (bytes.Length >= MsgLen && MsgLen >= 12)
                    {
                        buffer = new byte[MsgLen];
                        Buffer.BlockCopy(bytes, 0, buffer, 0, MsgLen);
                        Array.Clear(bytes, 0, MsgLen);
                        ProcessMessageBytes(buffer,head);
                        if (bytes.Length - MsgLen >= 12)
                        {
                            buffer = new byte[bytes.Length - MsgLen];
                            Buffer.BlockCopy(bytes, 0, buffer, 0, buffer.Length);
                            DealData(buffer);
                        }
                       // Array.Clear(bytes, 0, bytes.Length);
                    }
                    else
                    {
                       // Array.Clear(bytes, 0, bytes.Length);
                    }
                }
                else
                {
                    //Array.Clear(bytes, 0, bytes.Length);
                }
            }把sp1234指点后的代码再贴出来.再次请求sp1234指点!再看一下DataDeal(bytes)的方法.