欢迎访问宙启技术站
智能推送

使用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的聊天室程序。