用python实现聊天室
时间: 2023-09-21 16:09:43 浏览: 36
实现聊天室需要使用网络编程和多线程编程,下面给出一个简单的 Python 聊天室实现:
服务端代码 `server.py`:
```python
import socket
import threading
HOST = '127.0.0.1' # 服务端 IP
PORT = 9999 # 服务端端口
BUFSIZ = 1024 # 缓存大小
# 保存所有客户端的 socket 对象
clients = []
# 处理客户端消息的函数
def handle_client(client_sock, addr):
# 将客户端对象添加到 clients 列表中
clients.append(client_sock)
print(f'Connected from {addr}')
while True:
try:
# 接收客户端消息
data = client_sock.recv(BUFSIZ)
if not data:
break
# 将消息广播给所有客户端
for c in clients:
c.send(f'{addr}: {data.decode()}'.encode())
except:
break
# 客户端断开连接,将其从 clients 列表中移除
clients.remove(client_sock)
client_sock.close()
print(f'Connection closed from {addr}')
if __name__ == '__main__':
# 创建服务端 socket 对象
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind((HOST, PORT))
server_sock.listen(5)
print(f'Server started on {HOST}:{PORT}')
while True:
# 接受新的客户端连接
client_sock, addr = server_sock.accept()
# 创建新的线程处理客户端消息
t = threading.Thread(target=handle_client, args=(client_sock, addr))
t.start()
```
客户端代码 `client.py`:
```python
import socket
import threading
HOST = '127.0.0.1' # 服务端 IP
PORT = 9999 # 服务端端口
BUFSIZ = 1024 # 缓存大小
def handle_input(sock):
while True:
msg = input()
sock.send(msg.encode())
def handle_output(sock):
while True:
msg = sock.recv(BUFSIZ)
if not msg:
break
print(msg.decode())
if __name__ == '__main__':
# 创建客户端 socket 对象
client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sock.connect((HOST, PORT))
# 创建输入和输出线程
t1 = threading.Thread(target=handle_input, args=(client_sock,))
t2 = threading.Thread(target=handle_output, args=(client_sock,))
t1.start()
t2.start()
```
使用方法:
1. 运行 `server.py` 启动服务端;
2. 运行多个 `client.py` 客户端;
3. 在客户端输入消息,消息会被广播到所有客户端。