博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 标准库 18.1 - socket
阅读量:5759 次
发布时间:2019-06-18

本文共 1464 字,大约阅读时间需要 4 分钟。

hot3.png

socket 是一种常用的进程间通信接口。

socket object


Python 实现 socket 的主体对象是 socket.socket 类。两个互相连接的 socket 对象之间是对等的,因此他们的连接过程基本上是这样的:

  1. 乙方首先监听一个端口,并将自己的 ip 和 port 通过其他方式告知甲方
  2. 甲方向该 (ip, port) 发起连接请求
  3. 乙方接受此请求,连接建立成功,双方可以通信

用代码来解释就是这样:

乙:

import socketsock = socket.socket()sock.bind(('127.0.0.1', 2333))sock.listen(1)conn, addr = sock.accept()  # 这里可能会阻塞data = conn.recv(1024)  # 同上

甲:

import socketsock = socket.socket()sock.connect(('127.0.0.1', 2333))sock.send(b'hello')

其中乙方的 .bind 方法就是先声明并占用一个通信端口,这样甲方才知道第一次的连接请求应该发送到哪。然后乙方调用 .listen 方法开始监听,当甲方的 connect 请求发送过来后,调用 accept 方法即可接受甲方的连接请求,此方法返回一个新的 socket 对象(conn)和甲方的地址。

所以这里 type(conn) is type(sock) 是会返回 True 的,即当你调用一个已绑定的 socket 对象的 listen 方法时,他实际会调起一个服务器监听绑定的地址,并返回一个 新的 socket 对象用于通信,然后原 socket 对象继续监听,并在 accept 时继续创建新的 socket 对象。这里的甲乙 sock 对象是一种 C/S 模型。刚才说的对等模型其实是指 甲方的 sock 对象和乙方的 conn 对象。

因此这里的一个问题在于,乙方的 Server 在面对多个甲方的随机 connect 请求时,很可能没办法做到立即接受(.accept),而又不可能让甲方一直等待。所以 listen 方法提供了一个整型的 backlog 参数,在上例中其为 1. 这个参数表示在 accept 之前最多可以积压多少个 connect 请求。实际上说是积压,其实是直接返回了确认接受的信息。即,如果上面代码中乙方先不调用 accept,甲方也是可以 send 的,b'hello' 会被缓冲起来。乙方再调用 accept 和 recv 依然可以拿到数据。而因为上面设置的 backlog 是 1,所以如果在乙方 accept 之前又有一个 socket 向乙方发起 connect 请求,他就会立即收到一个显式的(积极的)拒绝连接响应。

send & recv


socket 因为是语言无关的接口,所以只能用它发送字节码(二进制)。所以你需要 encode/decode 一下你的字符串对象。而数据流(socket.SOCK_STREAM)又没有既定的边界。所以需要使用者自行管理边界问题。即甲方先后发送的两段数据,在乙方的缓冲中虽然有先后顺序,却没有间隔。

socketserver


socketserver 是 Python 标准库的一个包,功能如其名,是一个 socket 服务器开发框架。

转载于:https://my.oschina.net/lionets/blog/484450

你可能感兴趣的文章
oracle体系结构
查看>>
Microsoft Exchange Server 2010与Office 365混合部署升级到Exchange Server 2016混合部署汇总...
查看>>
Proxy服务器配置_Squid
查看>>
开启“无线网络”,提示:请启动windows零配置wzc服务
查看>>
【SDN】Openflow协议中对LLDP算法的理解--如何判断非OF区域的存在
查看>>
纯DIV+CSS简单实现Tab选项卡左右切换效果
查看>>
栈(一)
查看>>
ios 自定义delegate(一)
查看>>
创建美国地区的appleId
查看>>
例题10-2 UVa12169 Disgruntled Judge(拓展欧几里德)
查看>>
JS 原生ajax写法
查看>>
Composer管理PHP依赖关系
查看>>
React.js学习笔记之JSX解读
查看>>
我所了解的Libevent和SEDA架构
查看>>
Socket编程问题小记
查看>>
基于Flask-Angular的项目组网架构与部署
查看>>
一张图道尽程序员的出路
查看>>
redis 常用命令
查看>>
LVS+Keepalived高可用负载均衡集群架构
查看>>
烂泥:kvm安装windows系统蓝屏
查看>>