Python socket.py 模块记录

code // 只有上帝和我知道这行代码什么意思 1970.01.01
code // 现在只有上帝知道了 1970.01.07

记录一下Python socket.py 中各接口的作用。

ssl : pass

_socketmethods=(

'bind','connect','connect_ex','fileno','listen',

'getpeername','getsockname','getsockopt','setsockopt',

'sendall','setblocking',

'settimeout','gettimeout','shutdown')

模块被导入时给socket绑定上的方法名列表。

def meth(name,self,*args):
    return getattr(self._sock,name)(*args)
从socket属性中获取对应名字的方法。

for _m in _socketmethods:
    p = partial(meth,_m)
    p.__name__ = _m
    p.__doc__ = getattr(_realsocket,_m).__doc__
    m = MethodType(p,None,_socketobject)
    setattr(_socketobject,_m,m)
将_socket.py中的方法设置到_socketobject对象中,模块被引用时调用,具体为_socketmethods元祖中的方法名。

socket = SocketType = _socketobject # 对_socketobject类的引用,方便构造socket对象。
class _closedsocket:
      关闭了的socket类对象,将自身的_dummy方法覆盖了其它的基本方法 
class _socketobject:
      socket基本实体,初始化时绑定 _delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into","send", "sendto")等方法。
 初始化函数接收family, type, protocol参数,接收对象为socket.py 模块中的 SocketType类

      close(self):
            生成closedsocket类实例。干毛用未知。

      accept(self):
            调用自身的_socket对象进行接收链接的操作,接收操作返回sock链路实体对象与addr地址信息。将socket链路实体传入_socketobject后就获得了新的用来通讯的链路对象。
      dup(self):
            生成一个拥有相同资源的链路(未理解)。

      makefile(self):
            返回一个与socket一致的标准文件对象??
      family: property 返回family信息
      type: property 返回type信息
      proto: property 返回proto信息
总结: 导入时绑定socket基本方法,实例化时绑定接收,发送等方法。底层好像调用的都还是sendall方法,只不过是根据缓存区大小决定发不发送数据。
class _fileobject(object):
     default_bufsize = 8192
     name = "<socket>"
     def __init__(self, sock, mode='rb', bufsize=-1, close=False):
          初始化函数接收参数等。如果传入的bufsize参数乱七八糟的话,self.bufsize, self._rbufsize, self.wbufsize都默认为8192。
          self._rbuf = StringIO() 读缓存区用StringIO对象来记录数据?
          self._wbuf = [] 写入缓存区为字符串组成的列表,为毛?
          self._wbuf_len = 0 初始化的写缓存列表长度为0
          self.close = close 初始化时为False
     def _getclosed:
          返回布尔值,判断self._socket值是否为None
     def close:
          如果self._sock存在,将写缓存区的数据全部发出去。如果self._close属性为True,调用_socketobject的close方法。之后将self._socket置为None。
     def __del__(self):
          try: 
               self.close()
     def flush(self):
          将写缓存区列表里的元素组成一个字符串整体后,清空写缓存区列表,然后将数据一齐发出去。如果出现异常,未发送出去的数据slice之后添加回写缓存区。
     def fileno(self):
          获取文件描述符
     def write(self, data):
          将data字符串化后,将字符串添加到写缓存区,记录其长度。如果写缓存区超过默认大小的话,就flush发出去。
     def writelines(self, list):
           具体原理同write
     def read(self, size=-1):
           rbufsize度缓存区默认大小8192。buf为 StringIO()对象,调用read方法时,定位读取位置为结尾。然后根据read的参数size决定读取细节。
           1. 未指定size时默认接收到无数据可读为止。(收数据,写到缓存区,全部获取。
           2. 指定size参数时,记录当前读取位置,判断读取缓存区的数据大小是否超过size大小。
           2.1 超过的话就先读取size大小的数据出来,多出的数据存到读缓存区。(从缓存区读取数据)。
           2.2 未超过的话持续接收……没数据时停止。啊好累,一种读缓存区没数据的情况,直接返回数据。一种获取到同样大小数据后,写入读缓存区。
           def readline, readlines: // to do 
             
    def __iter__(self):
        return self

    def next(self):
        line = self.readline()
        if not line:
            raise StopIteration
        return line

总结: 通过类实现一个 file对象,并有相应的缓存区机制,实现读写操作,实现for 语句的操作等。只有read无指定size参数时会清空读缓存区。
                     
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容