逐步实现TCP服务端Step04-3:封装netio主逻辑

之前对代码做整理封装的时候,并没过多地考虑netio,当时的关注点在s上,只对s做了封装,现在对netio做类似的处理。

s与netio的主逻辑中有不少类似的地方,如使用共享内存,操作c2s_code_queue和s2c_code_queue等等。这些基础操作应被整合在Control类中,由于Control这个名字在处理s的时候已被使用,这里需要改下名字,将对应于s的Control类改为SControl,对应于netio的Control类命名为NControl,而Control则为它们共同的父类。

无论s还是netio,大流程可概括为三步:初始化 ...


逐步实现TCP服务端Step04-2:处理client断开

当某个client断开连接时,后端系统要做相应的“清理”工作。具体说来就是netio要销毁TCPSocket对象,s要销毁用户对象。

问题在于,client断开连接,s是不知道的,除非netio以某种方式告知它。

可以在c2s_code_queue中push一个特殊的code以表明某个client已经离线了。这样,一旦s取到该code就触发”清理“操作。

这个特殊的code其实不用专门去设计。考虑一下client断开时,TCP的做法是向对端发送一个不携带数据的报文段 ...


逐步实现TCP服务端Step04-1:改造

目前的这版程序不支持多客户并发,并非由于结构的局限性导致的无法实现。而是由于在早期不想引入不相关的复杂度而故意没去做这部分内容。

现在进行改造。主要修改netio,将监听socket置为非阻塞,让accept也参与到主循环中来。另外,还需要一个容器来存放那些已被accept了的新socket 。

这个容器要能方便地删除元素(客户离线),同时支持随机访问。基于数组存储的链式结构可以满足需求。

基于C++模板实现了一个不关注元素具体类型的List类 ...


Python小结:其它内容

11.1. 风格

编码规范详见《Google Python Style Guide》文档。

一些基本规则:

  • 前后都有下划线的变量名(__x__)是系统变量名,对解释器有特殊意义。如:__doc__ 。

  • 以单下划线开头的变量名(_x)不会被from module ...


Python小结:异常

异常是程序在运行时出现的错误或意外。

Python程序的异常若不在程序中化解,其最终将交由解释器来处理。解释器会抛出异常,并终止程序运行。

除非出现致命错误,否则,不应让程序随便终止。要对程序中可能出现的异常进行检测 ...


Python小结:类

Python中一切皆对象,因此类也是对象,叫“类对象”,类的实例就是对象的对象,叫做“实例对象”。

定义类的一般形式:

self用于指定当前实例,假设类ClassA的实例为a,那么基于实例a调用某个方法,如a ...