基于python的tcp聊天室

1.目标和思路

1.功能和目标: 类似群聊天
    [1]有人进入聊天室需要输入姓名,姓名不能重复
    [2] 有人进入聊天室时,其他人会收到通知:
        *** 进入聊天室
    [3] 一个人发消息,其他人会收到:
        ××× :××××××××
    [4] 有人退出聊天室,则其他人会收到通知:
        ××× 退出聊天室

2.确定技术模型
    [1] 使用字典保存用户信息 {姓名:客户端套接字}
    [2] 套接字选择: tcp套接字 
    [3] 转换模型 : 客户端-->>服务端-->>所有客户端
    [4] 收发关系处理: 一个客户端发送消息给服务端,服务端再转发给其他客户端
                    客户端使用多进程来分别处理收发消息
                    服务端使用多线程来管理客户端

3.具体实现流程
    [1] 搭建网络连接
    [2] 实现登录
            客户端: × 输入姓名
                    × 将姓名发送给服务端
                    × 接收服务端反馈
                    × 如果不允许进入则重新输入,允许则进入聊天室
                    × 创建新的进程用于收发消息

            服务端:  * 创建新的线程用于管理客户端的连接
                    × 接收姓名
                    ×  判断姓名是否存在
                    ×  将结果反馈给客户端
                    × 不允许 登录结束,允许登录则将用户信息插入数据机构保存
                    × 将登录信息通知其他人
    [3] 聊天
            客户端: × 循环发送消息
                    × 循环接收消息
            
            服务器: × 接收消息,判断请求类型
             
以下是使用Python实现的简单TCP聊天室服务器与客户端代码示例。 ### 服务器端代码 ```python import socket import threading # 创建socket,网络协议为ipv4,网络层协议为TCP server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定套接字,接收所有ip server.bind(('0.0.0.0', 9000)) # 监听端口,指定连接最大数量 server.listen(5) print("is listening...") clients = [] def handle_client(client_socket, client_address): while True: try: # 接收客户端数据 data = client_socket.recv(1024) if not data: break message = f"{client_address}: {data.decode('utf-8')}" print(message) # 广播消息给所有客户端 for client in clients: if client != client_socket: client.send(message.encode('utf-8')) except: break # 移除断开的客户端 clients.remove(client_socket) client_socket.close() while True: # 等待客户端连接,返回服务端socket连接和套接字 client_socket, client_address = server.accept() print(f"connect to client {client_address} successful") clients.append(client_socket) # 为每个客户端创建一个线程处理消息 client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address)) client_thread.start() ``` ### 客户端代码 ```python import socket import threading # 创建socket,网络协议为ipv4,网络层协议为TCP client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client.connect(('localhost', 9000)) def receive_messages(): while True: try: # 接收服务器消息 message = client.recv(1024).decode('utf-8') print(message) except: print("An error occurred!") client.close() break def send_messages(): while True: message = input() client.send(message.encode('utf-8')) # 启动接收消息线程 receive_thread = threading.Thread(target=receive_messages) receive_thread.start() # 启动发送消息线程 send_thread = threading.Thread(target=send_messages) send_thread.start() ``` 上述服务器端代码通过创建一个TCP套接字,绑定到指定地址和端口进行监听。当有客户端连接时,为每个客户端创建一个线程来处理其消息,并将消息广播给其他客户端。客户端代码通过连接到服务器,创建两个线程,一个用于接收服务器的消息,另一个用于发送用户输入的消息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值