基于socket和C/S模型的聊天室 功能要求实现单个server与多个client互发消息聊天室窗口里显示发送消息的时间戳+用户ID+内容,优先采用UDP协议可考虑引入多线程可将手机热点用作路由器建立内网从而实现多台计算机互通消息
时间: 2024-02-28 17:55:25 浏览: 60
基于socket和C/S模型的聊天室,实现单个server与多个client互发消息,并在聊天室窗口显示发送消息的时间戳+用户ID+内容,可以按照以下步骤实现:
1. 服务器端需要创建一个socket,绑定IP地址和端口号,并监听客户端的连接请求。服务器端使用UDP协议。
2. 客户端需要创建一个socket,并连接服务器端。
3. 客户端需要在发送消息时,将消息和时间戳、用户ID一起发送给服务器端。
4. 服务器端需要接收客户端发送的消息,并在消息前添加时间戳和用户ID,然后转发给其他客户端。
5. 客户端需要不断接收服务器端发送的消息,并在聊天室窗口中显示。
6. 当客户端发送消息时,需要将消息发送给服务器端。
7. 服务器端接收到客户端发送的消息后,需要转发给其他客户端。
下面是一个简单的示例代码,其中服务器端监听的端口号为8888,使用UDP协议:
服务器端代码:
```python
import socket
import threading
import time
# 存储所有客户端socket的列表
clients = []
def handle_client(client_socket, client_address):
# 将客户端socket添加到列表中
clients.append(client_socket)
while True:
# 接收客户端发送的消息
data, addr = client_socket.recvfrom(1024)
if not data:
break
# 添加时间戳和用户ID
timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
user_id = client_address[0] + ':' + str(client_address[1])
msg = timestamp + ' ' + user_id + ' ' + data.decode('utf-8')
# 将消息转发给其他客户端
for c in clients:
if c != client_socket:
c.sendto(msg.encode('utf-8'), addr)
# 将客户端socket从列表中移除
clients.remove(client_socket)
client_socket.close()
def main():
# 创建一个socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP地址和端口号
server_socket.bind(('127.0.0.1', 8888))
print('Server started, listening on port 8888...')
while True:
# 接收客户端连接请求
data, addr = server_socket.recvfrom(1024)
print('Client {} connected.'.format(addr))
# 创建一个子线程来处理客户端消息
t = threading.Thread(target=handle_client, args=(server_socket, addr))
t.start()
if __name__ == '__main__':
main()
```
客户端代码:
```python
import socket
import threading
import time
def receive_msg(client_socket):
while True:
# 接收服务器端发送的消息
data, addr = client_socket.recvfrom(1024)
if not data:
break
# 在聊天室窗口中显示消息
print(data.decode('utf-8'))
def main():
# 创建一个socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 连接服务器端
client_socket.connect(('127.0.0.1', 8888))
# 创建一个子线程来接收服务器端消息
t = threading.Thread(target=receive_msg, args=(client_socket,))
t.start()
while True:
# 发送消息给服务器端
data = input()
# 添加时间戳和用户ID
timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
user_id = client_socket.getsockname()[0] + ':' + str(client_socket.getsockname()[1])
msg = timestamp + ' ' + user_id + ' ' + data
client_socket.sendto(msg.encode('utf-8'), ('127.0.0.1', 8888))
if __name__ == '__main__':
main()
```
运行以上代码,可以启动一个聊天室,并在多个客户端之间互发消息,并在聊天室窗口中显示发送消息的时间戳+用户ID+内容。
阅读全文