基于select模型,编写一个基于tcp协议的聊天室
时间: 2023-11-29 21:02:38 浏览: 126
基于TCP协议编程的网络聊天室
基于select模型的TCP聊天室可以使用Python的socket库来实现。该模型允许多个客户端同时连接到服务器,并能够实时交换消息。
首先,服务器端的代码如下:
```python
import socket
import select
# 创建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定IP地址和端口号
server_socket.bind(('localhost', 12345))
# 监听连接
server_socket.listen(5)
# 创建列表,用于存储连接的客户端套接字
sockets_list = [server_socket]
print("聊天室服务器已启动")
# 处理消息的函数
def receive_message(client_socket):
try:
message = client_socket.recv(1024).decode()
if message:
print("接收到消息: " + message)
# 向其他所有客户端发送消息
for socket in sockets_list:
if socket != server_socket and socket != client_socket:
socket.send(message.encode())
else:
# 如果接收到空消息,表示客户端断开连接
sockets_list.remove(client_socket)
print("客户端断开连接")
client_socket.close()
except:
pass
while True:
# 使用select函数监视套接字列表
read_sockets, _, exception_sockets = select.select(sockets_list, [], sockets_list)
# 处理可读套接字
for notified_socket in read_sockets:
if notified_socket == server_socket:
# 处理新连接
client_socket, client_address = server_socket.accept()
sockets_list.append(client_socket)
print("新连接: " + client_address[0])
else:
# 处理已连接的客户端发送的消息
receive_message(notified_socket)
# 处理异常情况下的套接字
for notified_socket in exception_sockets:
sockets_list.remove(notified_socket)
print("异常套接字关闭")
notified_socket.close()
```
客户端的代码如下:
```python
import socket
import select
import sys
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
# 读取用户名
username = input("请输入用户名: ")
# 发送用户名到服务器
client_socket.send(username.encode())
print("已连接到聊天室服务器")
while True:
# 使用select函数监视输入和服务器消息
sockets_list = [sys.stdin, client_socket]
read_sockets, _, _ = select.select(sockets_list, [], [])
for notified_socket in read_sockets:
if notified_socket == client_socket:
# 接收服务器消息
message = client_socket.recv(1024).decode()
print(message)
else:
# 发送输入消息到服务器
message = sys.stdin.readline()
client_socket.send(message.encode())
sys.stdout.write("<You>")
sys.stdout.write(message)
sys.stdout.flush()
client_socket.close()
```
以上是一个基于select模型、使用TCP协议的简单聊天室的实现。服务器端可以处理多个客户端的连接和消息传输,客户端可以通过键盘输入发送消息,并接收其他客户端和服务器发来的消息。
阅读全文