使用Python的Client()创建基于TCP的聊天室程序
发布时间:2023-12-28 05:30:42
下面是一个使用Python的socket库和threading库来实现基于TCP的聊天室程序的示例。
1. 服务器端
首先,我们需要创建一个服务器端来处理客户端的连接和消息传递。服务器端的核心功能是监听来自客户端的连接,并使用多线程处理每个连接的消息传递。
import socket
import threading
class Server:
def __init__(self, host, port):
self.host = host
self.port = port
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((self.host, self.port))
self.server_socket.listen(5)
self.clients = []
self.nicknames = []
def broadcast(self, message):
for client in self.clients:
client.send(message)
def handle(self, client):
while True:
try:
message = client.recv(1024)
self.broadcast(message)
except:
index = self.clients.index(client)
self.clients.remove(client)
client.close()
nickname = self.nicknames[index]
self.nicknames.remove(nickname)
self.broadcast(f'{nickname} left the chat!')
break
def receive(self):
while True:
client, address = self.server_socket.accept()
client.send('NICK'.encode('utf-8'))
nickname = client.recv(1024).decode('utf-8')
self.nicknames.append(nickname)
self.clients.append(client)
print(f'{nickname} connected with {str(address)}!')
self.broadcast(f'{nickname} joined the chat!')
client.send('Connected to the server!'.encode('utf-8'))
client.send('You are connected!'.encode('utf-8'))
client_thread = threading.Thread(target=self.handle, args=(client,))
client_thread.start()
def start(self):
print('Server started!')
self.receive()
server = Server('localhost', 8888)
server.start()
2. 客户端
客户端需要连接到服务器,并发送和接收消息。我们可以使用一个线程来处理接收消息的过程,并使用一个主循环来发送消息。
import socket
import threading
class Client:
def __init__(self, nickname):
self.hostname = 'localhost'
self.port = 8888
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((self.hostname, self.port))
self.nickname = nickname
def receive(self):
while True:
try:
message = self.client_socket.recv(1024).decode('utf-8')
if message == 'NICK':
self.client_socket.send(self.nickname.encode('utf-8'))
else:
print(message)
except:
print('Error while receiving message!')
self.client_socket.close()
break
def write(self):
while True:
message = f'{self.nickname}: {input("")}'
self.client_socket.send(message.encode('utf-8'))
def start(self):
receive_thread = threading.Thread(target=self.receive)
receive_thread.start()
self.write()
nickname = input('Enter your nickname: ')
client = Client(nickname)
client.start()
在这个聊天室程序中,服务器端和客户端使用了多线程来处理消息的传递,可以同时处理多个客户端的连接和消息。服务器端通过监听客户端的连接,并在客户端连接时添加到客户端列表中,并向所有客户端广播消息。客户端连接到服务器,并发送昵称以进行识别,然后可以输入文本消息发送到服务器端。服务器端接收到消息后广播给所有客户端。
要运行这个示例,你可以首先运行服务器端脚本,然后运行多个客户端脚本,每个客户端使用不同的昵称。客户端可以输入消息并发送给服务器,服务器会将消息广播给所有连接的客户端。
希望这个示例可以帮助你理解如何使用Python的socket库和threading库创建基于TCP的聊天室程序。
