结合多线程和基于UDP协议的Socket编程,实现客户端发送字符串(内容不限)给服务器端,第1次发送时,即注册到服务器端。 (1.2) 客户端开启一个单独线程,接收服务器端发过来的数据,并打印在控制台
时间: 2024-04-30 19:23:29 浏览: 17
客户端代码如下:
```python
import socket
import threading
# 服务器地址和端口号
server_address = ('localhost', 8888)
# 创建客户端socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送消息给服务器端,注册客户端
client_socket.sendto(b'register', server_address)
# 接收服务器端发来的消息并打印
def receive_data():
while True:
data, addr = client_socket.recvfrom(1024)
print(f'Received data from {addr}: {data.decode()}')
# 开启单独线程接收服务器端发来的消息
receive_thread = threading.Thread(target=receive_data)
receive_thread.start()
# 发送消息给服务器端
while True:
message = input('请输入消息:')
client_socket.sendto(message.encode(), server_address)
```
服务器端代码如下:
```python
import socket
# 服务器地址和端口号
server_address = ('localhost', 8888)
# 创建服务器socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定服务器地址和端口号
server_socket.bind(server_address)
# 保存客户端地址的列表
clients = []
print('服务器已启动,等待客户端连接...')
# 接收客户端消息并处理
while True:
data, addr = server_socket.recvfrom(1024)
# 如果是新客户端连接,则将其地址加入到clients列表中
if addr not in clients:
clients.append(addr)
print(f'New client {addr} registered.')
# 如果是已注册的客户端发送消息,则将其消息发送给其他客户端
else:
print(f'Received data from {addr}: {data.decode()}')
for client in clients:
if client != addr:
server_socket.sendto(data, client)
```
运行客户端和服务器端代码,可以在客户端输入任意字符串并发送给服务器端,服务器端会将消息转发给其他客户端,同时客户端会打印出其他客户端发送的消息。客户端也可以随时收到服务器端发来的消息,例如其他客户端的连接和断开通知。