zoukankan      html  css  js  c++  java
  • C# TCPListener

    1: 有两个地方必须做异常处理,异常类型为IOException 

    服务器读客户端发来的信息时:

    LeafTCPClient client = (LeafTCPClient)ar.AsyncState;
    try
    {

    if (client.NetWork.Connected)
    {
    NetworkStream ns = client.NetWork.GetStream();
    byte[] recdata = new byte[ns.EndRead(ar)];//远程异常关闭时,执行完这句话后发生IOException异常

    ......

    }

    catch(IOException ex)

    {

    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }

      远程客户端异常断开时(比如断电),服务器正在读客户端发来的信息,若无异常处理,则会如下

    服务器向客户端写数据时,如果此时客户端已经异常断开,则

    2如何知晓远程连接的客户端突然断开,比如客户端突然断电断网

    (1)心跳包,保持客户端与服务器的数据交互

    (2)向客户端发送数据,客户端如果是断开连接的话,则会发生IOException,则在异常中释放该TCPClient,释放资源。

    3  .NET/C# 实现 TCP 高性能服务的不同方式

    • 在任何 TCP Server 的实现中,一定存在一个 Accept Socket Loop,用于接收 Client 端的 Connect 请求以建立 TCP Connection。
    • 在任何 TCP Server 的实现中,一定存在一个 Read Socket Loop,用于接收 Client 端 Write 过来的数据。

    如果 Accept 循环阻塞,则会导致无法快速的建立连接,服务端 Pending Backlog 满,进而导致 Client 端收到 Connect Timeout 的异常。如果 Read 循环阻塞,则显然会导致无法及时收到 Client 端发过来的数据,进而导致 Client 端 Send Buffer 满,无法再发送数据。

    从实现细节的角度看,能够导致服务阻塞的位置可能在:

    1. Accept 到新的 Socket,构建新的 Connection 需要分配各种资源,分配资源慢;
    2. Accept 到新的 Socket,没有及时触发下一次 Accept;
    3. Read 到新的 Buffer,判定 Payload 消息长度,判定过程长;
    4. Read 到新的 Buffer,发现 Payload 还没有收全,继续 Read,则 "可能" 会导致一次 Buffer Copy;
    5. Payload 接收完毕,进行 De-Serialization 转成可识别的 Protocol Message,反序列化慢;
    6. 由 Business Module 来处理相应的 Protocol Message,处理过程慢;

    1-2 涉及到 Accept 过程和 Connection 的建立过程,3-4 涉及到 ReceiveBuffer 的处理过程,5-6 涉及到应用逻辑侧的实现。

     http://www.cnblogs.com/gaochundong/p/csharp_tcp_service_models.html

  • 相关阅读:
    懒加载与预加载
    Javascript之 Ajax 与 JSON
    Q&A:为什么prototype中的方法不能赋值给变量,再调用?
    Javascript之 浅克隆 与 深克隆
    Javascript之 __proto__ 与 prototype
    React入门(二)—— Props属性
    React入门(一)—— State属性
    Flask调用layer-iframe后,如何从服务器端关闭弹出窗
    Python从入门到项目实践(明日科技 吉林大学出版社)
    从实例到数理来解析感知机学习算法(PLA)
  • 原文地址:https://www.cnblogs.com/fyp7077/p/7505832.html
Copyright © 2011-2022 走看看