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官方文档。

 

posted @ 2017-05-12 14:52  哈利波波特  阅读(17)  评论(0)    收藏  举报