python之 socketserver模块的使用

在我们正常的使用socket模块来写一个server的程序就会显得比较的复杂通常一般流程为

  1.生成socket实例对象

  2.绑定地址

  3.开始监听

  4.接收数据

一般demo为

# 服务器

import socket
server = socket.socket()  # 声明socket类型,同时生成socket连接对象
server.bind(('localhost', 6969))   # 绑定要监听的端口此时绑定的是本地
server.listen()  # 监听  括号里面的就是最大允许链接
print('等待电话打进来')
coon, addr = server.accept()  # 等待    (此时上面加一个while 就可以多个电话打进来并且进行通话)
# coon 就是客户端连过来而在服务器端为其生成的一个连接实例
# addr 就是地址
print('电话打进来了')
print(coon, addr)  # 将coon 与addr 显示出来
while True:  # 此时就可以一直不停的发送数据了, 此时的效果就是一个电话可以无阻碍的通话
    # 如果此时没有true的话就只能接收一次了
    data = coon.recv(1024)  # 接收数据
    print('recv:', data.decode())   # 此时注意我们需要吧接收的数据解码,因为发过来的是byte类型
    coon.send(data.upper())  # 将数据里面的字母转化为大写发送
    server.close()

这就是一个单个接入,多次接收的server 

如果想用多个接入多个接收的话我们只需要在coon上加一个while即可 ,对与server来说一个coon就是哟个接入点

那么我们的socketserver又是方便在何处呢

对于socketserver来说我们只需要修改头节点就可以了

我们需要新建立一个类在类里面修改 socketserver . BaseRequestHandler即可

在这个类中hand结束即代表 当前连接断开 

import socketserver


class My_TCPhandler(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            try:
                self.data = self.request.recv(1024)
                print("{} wrote:".format(self.client_address[0]))
                print(self.data)
                self.request.send(self.data.upper())  # 服务器端到此结束
            except ConnectionResetError as e:
                print(e)
                break


HOST, POST = "localhost", 9999
server = socketserver.ThreadingTCPServer((HOST, POST), My_TCPhandler)
# 并发 TCPServer改成 ThreadingTCPServer 在Linux是建议使用Forking来开多线程
server.serve_forever()

server = socketserver.ThreadingTCPServer((HOST, POST), My_TCPhandler) 时就是开了多线程可以多个接入,多个实时接收与发送
这样来看我们的的服务器端的程序是不是便捷了呢?

猜你喜欢

转载自www.cnblogs.com/BookMiki/p/10192311.html