Windows实现基于select模式启动服务器,然后启动两个客户端A和B,客户端A发消息给服务器,服务器转发给客户端B,客户端B打印显示接收到的消息。客户端B发消息给服务器,服务器转发给客户端A,客户端A打印显示接收到的消息。
时间: 2024-05-12 15:19:39 浏览: 54
以下是基于select模式的实现:
服务器端代码:
```python
import socket
import select
# 创建TCP套接字并绑定到本地端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(5)
print('Server is listening...')
# 创建列表来存储所有的客户端套接字
client_sockets = [server_socket]
while True:
# 使用select模式来监听客户端套接字的读事件
readable, _, _ = select.select(client_sockets, [], [])
for sock in readable:
if sock is server_socket:
# 如果是服务器套接字,则接受新的客户端连接
client_socket, client_address = server_socket.accept()
client_sockets.append(client_socket)
print('New client connected:', client_address)
else:
# 如果是客户端套接字,则接收客户端发送的消息并转发给其他客户端
data = sock.recv(1024)
if not data:
# 如果客户端关闭了连接,则从列表中移除该套接字
client_sockets.remove(sock)
print('Client disconnected')
else:
# 转发消息给其他客户端
for client in client_sockets:
if client is not server_socket and client is not sock:
client.send(data)
# 关闭服务器套接字
server_socket.close()
```
客户端A代码:
```python
import socket
# 创建TCP套接字并连接到服务器
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8888))
# 向服务器发送消息
client_socket.send('Hello from client A'.encode())
# 接收服务器转发的消息并打印显示
data = client_socket.recv(1024)
print('Received message:', data.decode())
# 关闭客户端套接字
client_socket.close()
```
客户端B代码:
```python
import socket
# 创建TCP套接字并连接到服务器
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8888))
# 向服务器发送消息
client_socket.send('Hello from client B'.encode())
# 接收服务器转发的消息并打印显示
data = client_socket.recv(1024)
print('Received message:', data.decode())
# 关闭客户端套接字
client_socket.close()
```
运行以上三份代码后,客户端A会发送一条消息给服务器,服务器会将该消息转发给客户端B,客户端B会打印显示接收到的消息;然后客户端B会发送一条消息给服务器,服务器会将该消息转发给客户端A,客户端A会打印显示接收到的消息。
阅读全文