socket流程:

  • 服务器监听:是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
  • 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  • 连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

服务器:

  • 打开socket:socket(Adress Family, Type)
  • 绑定地址与端口:s.bind((HOST, PORT))
  • 监听连接:s.listen(backlog)backlog为监听连接数
  • 接收连接:conn, addr = s.accept(),conn表示连接的socket对象,addr表示远端的地址与端口信息
  • 接收/发数据:s.recv(size),size为接收数据的缓冲区长度,s.send(data)

客户端:

  • 打开socket:同上
  • 连接服务器:connect((remote_ip, PORT))remote_ip可通过gethostbyname(HOST)获得
  • 发送/接收数据:同上
  • 关闭:socket:s.close()

异步处理:

  • select多线程
  • gevent协程
  • tornado web框架异步非阻塞IO

socket使用

要使用socket.socket()函数创建套接字,其语法如下
socket(socket_family, socket_type, protocol=1)
创建一个tcp/ip套接字:
ts = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建一个udp/ip套接字:
us = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

套接字对象(内建)方法

函数 描述
服务器端套接字函数
s.bind() 绑定地址(主机名,端口)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户端连接,(阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() s.connect()的扩展,出错时返回出错码,而不是抛出异常
公共用途套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据
s.sendall() 完整发送TCP数据
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址(TCP连接)
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设定指定套接字的参数
s.close() 关闭套接字
面向模块的套接字函数
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.gettimeout() 得到阻塞套接字操作的超时时间
s.settimeout() 设置阻塞套接字操作的超时时间
面向文件的套接字函数
s.fileon() 套接字的文件描述符
s.makefile() 创建一个与该套接字关联的文件对象
最后由 oucb 编辑于2016年05月07日 16:18