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

  • 相关阅读:
    GIT 基本语句
    SpringBoot查看哪些配置类自动生效
    LeetCode第一题 两数之和
    static{} java中的静态代码块
    mybatis引入mapper映射文件的4种方法(转)
    MySQL Charset/Collation(字符集/校对)(转)
    MySQL数据库的创建(详细)
    Eclipse出现Tomcat无法启动:Server Tomcat v8.5 Server at localhost failed to start问题
    判断一个int类型数字的奇偶性
    linux中安装erlang时使用make命令报错问题
  • 原文地址:https://www.cnblogs.com/fyp7077/p/7505832.html
Copyright © 2011-2022 走看看