欢迎访问宙启技术站
智能推送

使用PythonSocketServer实现简单的聊天服务器

发布时间:2023-12-25 04:16:44

Python提供了SocketServer模块,该模块包含了建立基于Socket的服务器的类。其中有一个重要的类是TCPServer类,它实现了一个TCP服务器,可以监听指定端口的连接请求。

下面是一个简单的聊天服务器的例子,该服务器在接收到客户端发送的消息后,将该消息广播给所有已连接的客户端。

import SocketServer

class ChatServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    clients = []  # 存储已连接的客户端

    def handle(self):
        self.request.send("欢迎加入聊天室!请输入你的昵称:")
        nickname = self.request.recv(1024).strip()
        self.broadcast(nickname + " 已加入聊天室")

        while True:
            message = self.request.recv(1024).strip()
            if message:
                self.broadcast(nickname + ": " + message)
            else:
                self.broadcast(nickname + " 已离开聊天室")
                break
    
    def broadcast(self, message):
        for client in self.clients:
            client.send(message + "
")

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    server = ChatServer((HOST, PORT))
    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.start()
    print("聊天服务器已启动,监听端口 %s" % PORT)

在上面的例子中,我们定义了一个ChatServer类来实现聊天服务器。该类继承自ThreadingMixIn和TCPServer类,它使用多线程同时处理多个客户端的连接请求。

在handle方法中,首先向客户端发送欢迎消息,并要求客户端输入昵称。然后,将该客户端加入到已连接客户端列表中,并向所有客户端广播有新成员加入的消息。

之后,在一个无限循环中,服务器将接收到的客户端发送的消息广播给所有客户端。如果接收到空消息,说明客户端已经断开连接,将向所有客户端广播该客户端离开的消息。

最后,在主程序中,我们创建了一个ChatServer对象,并使用ThreadingMixIn类的serve_forever方法启动服务器。服务器将在9999端口上监听客户端连接请求。

可以使用telnet命令或者编写客户端代码来连接到该服务器。当有新的客户端加入或发送消息时,服务器会将消息广播给所有已连接的客户端。

注意:上面的例子中,服务器没有任何安全验证和防止恶意访问的措施。在真实的应用中,通常需要对客户端进行身份验证,并对用户输入进行严格的安全检查。