Python读书笔记(二)---网络编程
python通过socket模块提供对网络编程的支持,要创建套接字,使用的函数是socket模块中的socket函数。
socket(socket_family, socket_type, protocol=0)
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
套接字对象的主要方法:
服务器套接字方法: s.bind()、s.listen()、s.accept()
s.bind(address):address的使用python文档中是这么说的“A pair (host, port) is used for the AF_INET address family”,这里如果host为空,那么代表可以接收任何可用地址。
s.listen([backlog]):参数代表可以传入连接请求的最大值。
s.accept():返回值是一个pair(conn, address),其中conn是一个可以接收和发送数据的socket,address则是客户端的地址
客户端套接字方法: s.connect()、s.connect_ex()
s.connect(address):address同上
普通套接字方法: s.recv()、s.recv_into()、s.send()、s.sendall()、s.recvfrom()、s.recvfrom_into()、s.sendto()、s.getpeername()、s.getsockname()、s.getsockopt()、s.setsockopt()、 s.shutdown()、s.close()、s.detach()、s.ioctl()。
s.recv(bufsize[, flags]):bufsize代表一次能接收的最大数据量,返回值是一个bytes object。注意这里的s=conn(accept的返回值中的conn)
原因分析:client一定是知道server的地址的,根据这个地址建立socket,就能send过去,但是server刚开始是不知道client的情况的,accept函数之后就知道了conn信息,因此调用conn的recv函数才能接收client传送的数据。
s.recvfrom(bufsize[, flags]):udp接收数据使用的函数,返回值是一个pair(bytes, address)。
s.send(bytes[, flags]): Returns the number of bytes sent. send的参数为bytes类型数据,可以使用encode函数将str转为bytes。
s.sendto(bytes, address):udp使用的传送数据的函数。
面向阻塞的套接字方法: s.setblocking()、s.settimeout()、s.gettimeout()。
面向文件的套接字方法: s.fileno()、s.makefile()。
数据属性: s.family、s.type、s.proto。
以windows为例,简单服务器与客户端代码如下:
1 from socket import * 2 from time import ctime 3 4 Host = '' 5 Port = 21567 6 Bufsize = 1024 7 Addr = (Host, Port) 8 9 tcpSerSock = socket(AF_INET, SOCK_STREAM) 10 tcpSerSock.bind(Addr) 11 tcpSerSock.listen(5) 12 13 while True: 14 print('waiting for connection') 15 tcpCliSock, addr = tcpSerSock.accept() 16 print('...connected from:', addr) 17 18 while True: 19 data = tcpCliSock.recv(Bufsize) 20 if not data: 21 break 22 tcpCliSock.send(b'[%s] %s' % (bytes(ctime(), 'utf-8'), data)) 23 #tcpCliSock.send(b'sucess!') 24 tcpCliSock.close() 25 tcpSerSock.close()
1 from socket import * 2 3 Host = 'localhost' 4 Port = 21567 5 Bufsize = 1024 6 Addr = (Host, Port) 7 8 tcpCliSock = socket(AF_INET, SOCK_STREAM) 9 tcpCliSock.connect(Addr) 10 while True: 11 data = input('> ') 12 if not data: 13 break 14 tcpCliSock.send(data.encode()) 15 data = tcpCliSock.recv(Bufsize) 16 if not data: 17 break 18 print(data) 19 20 tcpCliSock.close()
如果实现网络服务端的任务,那么要用socketserver模块(python2中叫SocketServer),要实现一个server要分几步,第一就是创建一个handler class,然后重写它的handle()方法,其次实例化一个server class,参考python官方文档。

浙公网安备 33010602011771号