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

最新文章

  1. 使用密码记录工具keepass来保存密码
  2. Wordpress基础:安装主题和插件
  3. 浅析css布局模型2
  4. 编写高质量iOS代码与OS X代码的effective 方法小结
  5. 金蝶BOS
  6. [原]Python 简单异常处理
  7. 实用bootstrap 表格控件
  8. linux重新编译内核
  9. Scala AOP
  10. org.springside.modules.orm中的page类自我解读
  11. JavaScript 原型与继承机制详解
  12. WebApp开发总结
  13. hihoCoder #1094 : Lost in the City(枚举,微软苏州校招笔试 12月27日 )
  14. 1052. Linked List Sorting (25)
  15. [翻译 EF Core in Action 1.8] MyFirstEfCoreApp应用程序设置
  16. 数组方法map(映射),reduce(规约),foreach(遍历),filter(过滤)
  17. Java压缩文件
  18. YQCB冲刺第二周第二天
  19. Python网络管理模块Paramiko-代码实例
  20. React Native区分安卓/iOS平台

热门文章

  1. Flask【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等
  2. SpringCloud学习系列-Eureka服务注册与发现(3)
  3. 《SaltStack技术入门与实践》—— Mine
  4. 【JavaScript】对象 obj.name 语法与 obj[name]语法
  5. vue的生产环境dependencies 和开发环境devDependencies,二者的理解和区别
  6. a标签禁止跳转
  7. jsp大文件下载+断点续传
  8. POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)
  9. wxy和zdy眼中的水题 地精部落 dp
  10. nginx做反向代理时出现302错误(转载)