解决方案 »

  1.   

    1、  if (s.Available == 0)这个解释说是为了判断是否接收完成,这是什么意思?还有可能接受没完成吗?还是说光开始设置的缓冲大小,超过了缓冲大小的原因?   如果发送数据超过缓冲大小,那会不会是截断了数据?剩余的数据是二次发送吗?
    这个不太清楚,留给大神吧.
    2、网上的例子都是接受完成后都会接着发送数据,这是为什么?是都是要这样还是要根据项目需求?
    即使客户端不需要服务端返回数据,起码服务端得告诉客户端本次发送是成功接收到了吧?
    3、还有socket 的Listen方法,参数int的值如果是10,是一共监听这个10个链接还是说可以并发处理10个链接?
    并发处理.
    4、把所有链接的SocketAsyncEventArgs保存到list中,是不是想发送的时候就可以选择一个发送了?
    不能.你必须在本次连接断开之前发送.否则客户端已经超时,无法再接收来自服务端的数据.除非客户端也开一个监听,不断接收来自服务端的数据.
      

  2.   

    我了解一些,也来探讨一下:
    1 s.Available应该是有效字节数,这个应该用不着了,异步操作的e.BytesTransferred就代表收到的字节数.
      如果是0代表客户端断开连接了,服务端必须也断开.
    2 接收完成后立即发送是业务处理的常用模式,就是一问一答式,如果需要进行推送就不是这样了.
    3 Listen 的参数应该是等候连接时排队长度,如果排满的情况下新的客户端不等待就返回失败了.
    4 保存连接一是可以进行推送时获取连接,另外就是服务器如果退出时,逐个关闭连接是比较好的处理方式.
      

  3.   


    关于第四条,我的意思就是链接成功后就加入list,端口链接后从list中去除,这样,正链接的是不是就可以直接推送消息了?还有,心跳包是不是必须的?
      

  4.   

    说话真绕,首先要确定几点,
    1 发送数据无需缓冲,也无需了解接收方是否有缓冲及其大小.
    2 接收时设置的缓冲大小甚至没有缓冲,都不会影响传送的数据
    3 只要是TCP就是字节流,就不能假想是发一次对应收一次,而是将所有发送的数据连成一体,接收的时候有可能在任意字节处断开,需要接收几次.