在连接以后
从服务端直接往客户端发数据
 Socket s = cl;
if (s.Connected)
{
       s.Send(message, message.Length, 0);}
message的数据是异步读取的消息队列
客户端代码是
 //异步读取数据的辅助类
        public class StateInfo
        {
            public Socket socket = null;
            public const int bufferSize = 256;
            public byte[] buffer = new byte[bufferSize];
            public StringBuilder sb = new StringBuilder();
        } private static void Receive(Socket socket)
        {
            try
            {
                StateInfo state = new StateInfo();
                state.socket = socket;
                socket.BeginReceive(state.buffer, 0, state.buffer.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallback), state);            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
private static void ReceiveCallback(IAsyncResult ar)
        {                StateInfo state = (StateInfo)ar.AsyncState;
                //读取数据
                int dataSize = state.socket.EndReceive(ar);
                if (dataSize > 0)
                {
                    state.sb.Remove(0, state.sb.Length);
                    state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, dataSize));                        state.socket.BeginReceive(state.buffer, 0, state.buffer.Length, SocketFlags.None,
                       new AsyncCallback(ReceiveCallback), state);
                        //显示接收数据
                        string content = state.sb.ToString();                }        }
比如我消息队列里有abcd和efgh2条数据,在客户端的content有时候可能接到1条数据"abcdefgh",也有可能是"ab"和"cdefgh",也就是数据都乱了,求解

解决方案 »

  1.   

    不可能乱的,除非你是要将两个Socket对象的数据合并到一起,只有一个Socket对象的情况下,肯定是按照发送的顺序接收的。
      

  2.   

    你可能两个socket用的同一个事件,这样就可能混合。
      

  3.   


    还是那句话,不可能混合的,你上面给的代码没有包含显示数据部分,你那个“string content = state.sb.ToString();”并没有做到显示数据,存放在一个临时变量里就没有用到,所以问题肯定是你没有贴出来的数据显示部分。
      

  4.   

    TCP 是面向连接的协议,所以在一个连接里面是不可能搞乱顺序的,除非你故意把两个连接的数据搅合到一起。
      

  5.   

    代码就是如上所述,的确是混合了啊string content = state.sb.ToString()这里之前我还把state.sb的 值调试插入数据库了,的确不是按发送的时候每条数据分开的。会不会是因为我的函数是静态的原因?
      

  6.   

    加入你有两个state,为了区分方便,我分别叫他们state1和state2,那么你必须保证state1和state2全部读完了再访问state1.sb和state2.sb,你肯定是在接收过程中访问state.sb,导致数据混到一起去了。判断是否全部读完了,最简单的方法就是检查socket是否关闭了,socket关闭说明不可能再有数据进来了。
      

  7.   

    这个现象叫做"粘包",可以看看这篇文章:解决TCP网络传输“粘包”问题通常需要为每个数据包,给个头部+包的大小+数据.这样就容易解包了.
      

  8.   

    问题就在于我的socket是保持连接的,不是接收一个包就关闭了,实际上我也就只开了一个socket服务端和客户端,客户端只是隔一段就是访问一下服务端保持联系,其他时候都是服务端往客户端push信息,然后客户端做处理