python网络编程之sockserver模块总结

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Steps-of-time

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值