1,在python3中一个高级模块在socketserver封装了一系列的网络服务,如tcp,udp服务等相关模块。最近在使用做个总结。(后续持续更新)
2,如下为几个模块简要举例.
TCPServer模块,构建一个Tcp服务。如下所示:
#-*-codeing:utf-8-*-
from socketserver import TCPServer as TCPSer
from socketserver import StreamRequestHandler as SHRSer
class MyRequestHandler(SHRSer):
def handle(self):
print('%s connect to tcpser !' %(self.client_address))
while True:
data = self.request.recv(1024).decode('utf-8')
print('recv from %s msg is:' %(self.client_address,data))
self.request.close()
if __name__ == "__main__":
ip = ''
port = 8000
addr = (ip,port)
try:
tcpser = TCPSer(addr,MyRequestHandler)
print('Tcp ser is starting ...')
tcpser.serve_forever()
except KeyboardInterrupt:
print('Tcp ser is stoping ...')
tcpser.server_close() #关闭服务
如上所示在创建一个tcp服务的时候需要我们自定义创建一个请求处理句柄累。通过继承
StreamRequestHandler流式请求处理类,其内部定义相应的handle方法,通过在子类中重写该方法来处理客户端的请求处理过程。在其内部有成员client_address该成员保存的客户端连接的对象地址信息。另外还有成员request,在该处保存的客户端连接的sock对象。可通过其进行客户端数据请求的处理过程。(注,该服务端两端在进行数据发送和接收处理时必须是使用utf-8的方式进行数据处理的)
client.py代码:客户端使用原生socket进行编写连接之tcp服务。
import socket
ip = ''
port = 8000
addr = (ip,port)
clifd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clifd.connect(addr)
while True:
msg = input('>>>')
clifd.send(msg.encode('utf-8'))
if msg == 'quit':
break
msg = clifd.recv(1024).decode('utf-8')
print('Recv tcp ser response msg is %s' %(msg))
clifd.close()
--------------------------------------------------------------------------------------------------------------------UDPSer服务模块:
#-*-codeing:utf-8-*-
from socketserver import UDPServer as UDPSer
from socketserver import DatagramRequestHandler as DRH
ip = ''
port = 9000
addr = (ip,port)
class MyUdpHander(DRH):
def handle(self):
msg = self.request[0].decode('utf-8')
print('recv from %s a msg is:%s' %(self.request[1],msg))
if __name__ =="__main__":
try:
udpser = UDPSer(addr,MyUdpHander)
print('UDP ser is starting ...')
udpser.serve_forever()
except KeyboardInterrupt:
udpser.server_close()
如上代码所示:在UDP服务中有成员request是一个二元元组,其中request[0] 存储的是客户端发送来的消息,request[1]存储的是客户端的地址信息。
UDPclient:
#-*-codeing:utf-8-*-
import socket
ip = ''
port = 9000
addr = (ip,port)
clifd = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input('>>>')
clifd.sendto(msg.encode('utf-8'),addr)
msg = clifd.recvfrom(1024)
print('recv ser response msg is:%s' %(msg.decode('utf-8')))
clifd.close()