@为结束标识(用定长或发前长度消息一样有下边的困扰)
比如A客户发"abcdefg@" 
   B客户发"hijklmn@"
而服务器是异步的。收到消息就返回
假设服务器收到了A的abcde(请教问题1.那服务器要怎样做来以确保收完了数据?)
假设服务器在收到了A的abcde后。收到的是B的hijklmn@。那又要咋办?这不全乱了?
以上几个问号困扰了我很久。希望会的朋友帮我一下

解决方案 »

  1.   

    读取的时候是stream流来完成的 这个流有一个方法是读取完 关于后面的问题是通过单独的线程来处理单独的事务
      

  2.   

    呵呵。真不好意思。粗心了。忘了TCP每个用一个端口
    有人帮我看一下每一个问号吗?
    (假设服务器收到了A的abcde(请教问题1.那服务器要怎样做来以确保收完了数据?) )
      

  3.   

    阻塞模式我可以while(read_data)不知道异步咋搞
      

  4.   


    可以的,callback加标识参数
      

  5.   

    定义自己的协议,在协议头部分加入发送的数据的长度,然后服务端接收道之后,解析协议,就知道长度了,然后达到接收长度就接收完毕啊。
    你的困扰不在这里,你的意思是A和B用的是一个端口,而且同时发送,而且没有自己的协议,协议头就应该写明自己的身份,我就是A,然后每个数据包都要添加协议头的,你要好好看看TCP/IP了,看看里面的四层是怎么通信的,每层都添加自己的协议的,每个数据报都有协议头的,
      

  6.   

    识别客户定义自己的协议,比如我的是 GamePlayer|PlayerName|……(用户登录时把登录名存放到PlayerName里)用|做分割split提取PlayerName根据登录名来识别是哪个客户发过来的
      

  7.   

    确保客户端数据完整
    //得到一条消息的长度
    byte datasize=new byte[4];
    netstream.Read(datasize,0,4) //前4位是消息的长度 int size=System.BitConverter.Toint32(datasize,0); //返回由字节数组中指定位置的4个字节换来的32位有符号整数 //循环接收直到一条完整的消息全部读入字节数组中
    byte[] message=new byte[size]; int dataLeft=size;
    int start=0;
    while(dataLeft>0)
    {
    int recv=netStream.Read(message,start,dataleft);
    //recv为已读取的字节长度,如果没读取完,循环读取
    start+=recv;
    dataleft-=recv;
    }
      

  8.   

    还有,你用的是异步套接字吗,在BeginReceive委托函数里再建1个新的BeginReceive委托也就是说,假如A数据先来,服务器收到后,处理完,便建立一个BeginReceive委托,B数据第二个来,该委托处理完B数据,再建1个BeginReceive委托,这样不停的处理下去A数据和B数据是通过2个不同的委托接收到服务器的,不会混淆在一起就象我先前说的自己定义一个协议,就能识别是哪个客户发过来的信息