python的网络编程
python的网络编程接口和linux/unix的c接口差不多。
#####################################################################
socket模块:
socket模块的内建函数:
create_connection(address,timeout=<objectobject>,source_address=None)
gethostname
gethostbyaddr
gethostbyname
gethostbyname_ex
getservbyname
getservbyport
getprotobyname
getaddrinfo
getnameinfo
has_ipv6
ntohl(integer) -> integer
ntohs(integer) -> integer
htonl(integer) -> integer
htons(integer) -> integer
inet_aton(string) ->packed 32-bit IP representation
inet_ntoa(packed_ip) ->ip_address_string
getdefaulttimeout
setdefaulttimeout
getfqdn
socket的异常类:
error
gaierror
herror
sslerror
timeout
socket类:
socket([family[, type[,proto]]]) -> socket object
返回套接字实例。建立套接字。
family默认为:AF_INET
type可选:
SOCK_STREAM(TCP)
SOCK_DGRAM(UDP)
proto默认为:0
socket类的方法:
bind(address)
address:一般为ip和port对: (host, port).
用来绑定地址到套接字。
listen(backlog)
backlog:至少为0,规定内核应该为相应套接字排队的最大连接个数。
服务器用来保存未处理的连接请求。
accept() 返回 (socket object, address info)
返回一个新的已连接套接字描述符和
客户端的地址信息(hostaddr, port)
服务器用来建立连接
connect(address)
connect_ex(address):和connect一样,但是失败返回errno。
address:一般为ip和port对: (host, port).
客户端用来发起连接。
close()
关闭套接字。
shutdown(flag)
flag:
SHUT_RD:关闭读这一半,套接字中不再有数据可接收,套接字接收缓冲区中的数据也清空。
SHUT_WR:关闭写这一半,在套接字发送缓冲区中的数据会被发送出去,然后正常终止连接。
SHUT_RDWR:关闭读和写
tcp的收发方法:
recv(bufsize[, flags]):
以字符串形式返回接收到的数据,bufsize指定接收最大数据量,flags忽略。
recv_into(buffer[, nbytes[,flags]]):
send(string[, flags]):
返回发送的字节数量
sendall(string[, flags]):失败抛出异常。
udp的收发方法:
recvfrom(bufsize[,flags])->(data,address)
data是接收到的数据的字符串,address是发送方的地址。
recvfrom_into(buffer[,nbytes[, flags]])
sendto(string[, flags],address):
address是(host,port)元祖的远程地址,返回发送字节数。
getsockname() -> addressinfo
返回本地套接字地址信息(hostaddr,port)
getpeername() -> addressinfo
返回对端套接字地址信息(hostaddr,port)
setsockopt(level, option,value)
设置option套接字选项值为value。
getsockopt(level, option[,buffersize]) -> value
获取套接字选项option的值。
gettimeout() -> timeout
返回当前超时期的值。
settimeout(timeout)
设置超时时间。
makefile
ioctl
dup
fileno
setblocking
###############################################################
select模块:
select模块的内建函数select:
select(rlist,wlist, xlist[, timeout]) -> (rlist, wlist, xlist)
select模块的内建函数poll:
poll()
windows不支持poll函数。
poll可用的方法:
register(fd[, eventmask]):
注册新的文件描述符fd。
unregister(fd):
从轮询对象中删除文件描述符fd。
poll([timeout])
对所有已注册的文件描述符事件进行轮询。
#####################################################################
asyncore模块:用来构建异步网络应用程序。
loop(timeout=30.0,use_poll=False, map=None, count=None)函数:
timeout是超时时间,map是要监视的通道;
默认使用select进行轮询,如果use_poll=True使用poll进行轮询;
count指定返回之前要执行的轮询操作次数。
dispatchr([sock=None, map=None])类的方法:
create_socket
bind
listen
…
#####################################################################
asynchat模块:简化了用asyncore模块实现异步网络应用程序的实现过程。
simple_producer([data,buffer_size=512])类:
从字节字符串data生成数据块,buffer_size指定数据块大小,默认为512.
async_chat([sock=None, map=None])类的方法:
collect_incoming_data(data)
在网络连接收到数据时调用。
found_terminator()
在检测到请求结束时调用。
…
###############################################################
SocketServer模块:
python3中改为socketserver。
用于简化实现网络客户端与服务器的大量样板代码。
四个基类:
BaseRequestHandler类
BaseServer类
ForkingMixIn
ThreadingMixIn
tcp的处理:
class StreamRequestHandler(BaseRequestHandler)
| self.rfile:从客户端读取数据的类文件
self.wfile:将数据写入客户端的类文件
__init__(self, request, client_address, server)
rfile和wfile使用文件的read、readline、write函数读写。
StreamRequestHandler的方法:
setup()
handle():有客户消息进来这个方法就会被调用,这个方法执行实际的请求操作,同时设置三个有用的实例变量:request包含请求,client_address包含客户端地址,server包含调用处理程序的实例。
finish()
…
class TCPServer(BaseServer)
__init__(server_address,RequestHandlerClass,bind_and_activate=True)
TCPServer的方法:
serve_forever():处理无限请求数。
…
class ThreadingTCPServer(ThreadingMixIn, TCPServer)
class ForkingTCPServer(ForkingMixIn, TCPServer)
udp的处理:和tcp的处理基本一样。
class DatagramRequestHandler(BaseRequestHandler)
self.rfile
self.wfile
__init__(self, request, client_address, server)
class UDPServer(TCPServer)
__init__(self,server_address,RequestHandlerClass,bind_and_activate=True)
class ThreadingUDPServer(ThreadingMixIn, UDPServer)
__init__(self,server_address,RequestHandlerClass,bind_and_activate=True)
class ForkingUDPServer(ForkingMixIn, UDPServer)
__init__(self,server_address,RequestHandlerClass,bind_and_activate=True)