python多用户登录_python 多人聊天的实现(含客户端以及服务端源码)
时间: 2023-12-20 18:15:15 浏览: 27
实现多用户登录和多人聊天的过程中,需要用到socket编程以及多线程编程。以下是一个简单的示例,包含客户端和服务端的源码。
服务端代码:
```python
import socket
import threading
# 服务器IP和端口号
HOST = 'localhost'
PORT = 8888
# 存储客户端连接信息的字典
clients = {}
# 处理客户端消息
def handle_client(conn, addr, name):
while True:
try:
msg = conn.recv(1024).decode('utf-8')
# 如果客户端发送“quit”,则退出聊天室
if msg == 'quit':
conn.send('quit'.encode('utf-8'))
conn.close()
del clients[name]
print('{}已退出聊天室'.format(name))
break
# 向所有客户端发送消息
for key, value in clients.items():
value.send('{}: {}'.format(name, msg).encode('utf-8'))
except:
del clients[name]
print('{}已断开连接'.format(name))
break
# 监听客户端连接
def accept_client(server_socket):
while True:
conn, addr = server_socket.accept()
name = conn.recv(1024).decode('utf-8')
clients[name] = conn
print('{}已连接'.format(name))
# 向客户端发送欢迎消息
conn.send('欢迎来到聊天室!'.encode('utf-8'))
# 创建新线程处理客户端消息
t = threading.Thread(target=handle_client, args=(conn, addr, name))
t.start()
if __name__ == '__main__':
# 创建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口号
server_socket.bind((HOST, PORT))
# 监听连接
server_socket.listen(5)
print('聊天室已启动,等待连接...')
# 接受连接并处理消息
accept_client(server_socket)
```
客户端代码:
```python
import socket
import threading
# 服务器IP和端口号
HOST = 'localhost'
PORT = 8888
# 处理接收消息
def recv_msg(client_socket):
while True:
try:
msg = client_socket.recv(1024).decode('utf-8')
print(msg)
except:
print('连接已断开')
client_socket.close()
break
# 处理发送消息
def send_msg(client_socket, name):
while True:
try:
msg = input()
client_socket.send(msg.encode('utf-8'))
# 如果发送“quit”,则退出聊天室
if msg == 'quit':
client_socket.close()
break
except:
print('连接已断开')
client_socket.close()
break
if __name__ == '__main__':
# 创建套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect((HOST, PORT))
# 输入用户名
name = input('请输入用户名:')
client_socket.send(name.encode('utf-8'))
# 创建新线程接收消息
t1 = threading.Thread(target=recv_msg, args=(client_socket,))
t1.start()
# 创建新线程发送消息
t2 = threading.Thread(target=send_msg, args=(client_socket, name))
t2.start()
```
注:以上代码仅为示例,可能存在一些问题和不足。在实际应用中,需要考虑更多的异常情况和安全性问题。