python socketserver 进一步封装应用 实现socketserver处理多连接

实现链接状态保持,查看状态,指定客户端发送消息

代码示例来源https://blog.csdn.net/qq_39687901/article/details/81536641

server端代码

import socketserver
import threading
 
ADDRESS = ('127.0.0.1', 8712)  # 绑定地址
 
g_conn_pool = []  # 连接池
 
 
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
 
    def setup(self):
        self.request.sendall("连接服务器成功!".encode(encoding='utf8'))
        # 加入连接池
        g_conn_pool.append(self.request)
 
    def handle(self):
        while True:
            try:
                bytes = self.request.recv(1024)
                print("客户端消息:", bytes.decode(encoding="utf8"))
            except:  # 意外掉线
                self.remove()
                break
 
    def finish(self):
        print("清除了这个客户端。")
 
    def remove(self):
        print("有一个客户端掉线了。")
        g_conn_pool.remove(self.request)
 
 
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    allow_reuse_address = True
 
 
if __name__ == '__main__':
    server = ThreadedTCPServer(ADDRESS, ThreadedTCPRequestHandler)
    # 新开一个线程运行服务端
    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.daemon = True
    server_thread.start()
 
    # 主线程逻辑
    while True:
        cmd = input("""--------------------------
输入1:查看当前在线人数
输入2:给指定客户端发送消息
输入3:关闭服务端
""")
        if cmd == '1':
            print("--------------------------")
            print("当前在线人数:", len(g_conn_pool))
        elif cmd == '2':
            print("--------------------------")
            index, msg = input("请输入“索引,消息”的形式:").split(",")
            g_conn_pool[int(index)].sendall(msg.encode(encoding='utf8'))
        elif cmd == '3':
            server.shutdown()
            server.server_close()
            exit()

client  客户端代码

import socket  # 导入 socket 模块
 
s = socket.socket()  # 创建 socket 对象
s.connect(('127.0.0.1', 8712))
print(s.recv(1024).decode(encoding='utf8'))
s.send("连接了".encode('utf8'))
print(s.recv(1024).decode(encoding='utf8'))
input("")

猜你喜欢

转载自blog.csdn.net/kaikai136412162/article/details/90297138