• socket object
  • 一个简单的python socket编程
  • python socket write/read only
  • python socket doc
1、对于服务器端
  • server = socket(AF_INET, SOCK_STREAM) # 创建Socket对象,即socket.socket( family, type )family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
  • server.bind((destIP, destPort) # 绑定,由AF_INET所创建的套接字,address地址格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。
  • server.listen(5)#监听,最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
  • client, addr = server.accept()#等待连接,若连接上,返回一个socket对象及对应的地址。调用accept方法时,socket会时入“waiting”状态。返回一个新的socket对象,服务器必须通过它与客户通信和客户Internet地址。
  • client.send('something')#发送数据,返回实际发送数据的字节数
  • rdata = client.recv(1024)#接收最多不超过1024个字节数据,返回对应字符串。指定的整数一般为2的幂次,对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
  • server.close()# 关闭连接
2、对于客户端
  • client = socket(AF_INET, SOCK_STREAM)# 创建,和上述一样
  • client.connect((destIP, destPort))
  • client.send('something')
  • client.recv(1024)
  • client.close()
3、socket异常处理
  • socket.error,包含一个错误号和错误信息,比如说(111, 'Connection refused'),表示连接拒绝,可能是服务器端没有开启。
  • socket.timeout,超时异常。
4、杂项
  • 一server和一client的send和recv不是一一对应的,而是严格按照指定字节来区分的。比如说:client.send(data)和server.recv(1024),若client的data实际上没有1024字节,那么server会等待直至client再send剩余的字节数,直至到1024,那么server接收后为data+其他数据。指定数据大小比较麻烦。
  • 出现了个OSError,查找了下,是由于一些.so文件,同时链接到其他文件,但这些链接文件是错误指向,出现No such file or directory错误,进而抛出异常。