使用select端口复用技术,实现一个聊天程序的服务器端的代码
时间: 2024-05-08 08:20:14 浏览: 14
好的,以下是使用select端口复用技术实现聊天程序服务器端的代码示例,仅供参考:
```python
import select
import socket
HOST = '127.0.0.1' # 服务器IP地址
PORT = 6666 # 服务器端口号
BACKLOG = 5 # 最大连接数
RECV_BUFFER = 1024 # 接收数据缓存大小
# 创建socket对象并绑定IP地址和端口号
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(BACKLOG)
input_list = [server_socket] # select函数监听的输入列表
client_dict = {} # 客户端socket字典
def broadcast_msg(sock, message):
# 广播消息给所有在线客户端
for client_sock in client_dict.values():
if client_sock != sock:
client_sock.send(message.encode('utf-8'))
while True:
# 使用select函数监听输入列表
read_sockets, write_sockets, error_sockets = select.select(input_list, [], [])
for sock in read_sockets:
if sock == server_socket:
# 新客户端连接
client_socket, client_address = server_socket.accept()
input_list.append(client_socket)
client_dict[client_socket] = client_address
print('Client %s:%s connected.' % client_address)
broadcast_msg(client_socket, 'Client %s:%s entered room.\n' % client_address)
else:
# 客户端发送消息
try:
data = sock.recv(RECV_BUFFER).decode('utf-8')
if data:
print('[%s:%s] %s' % (client_dict[sock][0], client_dict[sock][1], data))
broadcast_msg(sock, '[%s:%s] %s' % (client_dict[sock][0], client_dict[sock][1], data))
except:
# 客户端意外退出
print('Client %s:%s disconnected.' % client_dict[sock])
broadcast_msg(sock, 'Client %s:%s left room.\n' % client_dict[sock])
sock.close()
input_list.remove(sock)
del client_dict[sock]
continue
server_socket.close()
```
以上是一个简单的Python聊天程序服务器端的实现,使用了select端口复用技术来监听多个客户端连接和消息发送。当有新客户端连接时,服务器广播一条消息给所有在线客户端;当客户端发送消息时,服务器打印消息并广播给其他在线客户端;当客户端意外退出时,服务器广播一条消息并删除该客户端的socket连接。