Python多型服务器

发布于 2025-02-07 15:33:15 字数 3640 浏览 2 评论 0原文

我想创建一个可以向特定客户端发送特定消息的TCP服务器。在我的示例中,我有两个客户图标和机器人。这些客户连接后,我想向每个客户发送特定的消息。我希望分别将Vitai和Vitar发送给客户。一旦我收到了两个客户的回复,我希望跳到def chat()目的是从客户端获取响应,然后跳到def chat()哪个就像聊天室一样,显示客户发送的消息。我该如何实现?

服务器


import threading 
import socket 

PORT = 1026
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER,PORT)
FORMAT = "utf-8"
HEADER = 1024
DISCONNECT_MESSAGE = "END_CYCLE"
VITA_R = "yes"
VITA_I = "yes"
robot_flag = False
iconet_flag = False

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)
clients = []
aliases = []
alias_dictionary_iter = zip(aliases,clients)
alias_dictionary = dict(alias_dictionary_iter)

def broadcast(broadcast_message):
    for client in clients:
        client.send(broadcast_message)

def handle_client(client,addr):
    print(f"[NEW CONNECTION] {addr} connected.")
    connected = True
    while connected:
        for client in clients:
         if client == clients[0]:
            robot_message = 'VITAr'
            client.send(robot_message.encode(FORMAT))
            robot_response = client.recv(2048).decode(FORMAT)
            print(robot_response)
            if robot_response == VITA_R:
                robot_flag == True
            else:
                robot_flag == False
          
         elif client == clients[1]:
            iconet_message = 'VITAi'
            client.send(iconet_message.encode(FORMAT))
            iconet_response = client.recv(2048).decode(FORMAT)
            print(iconet_response)
            if iconet_response == VITA_I:
                iconet_flag == True
            else:
                iconet_flag == False
                    
def chat(client):
            while robot_flag & iconet_flag == True:
                try:
                    message = client.recv(1024)
                    broadcast(message)
                    print(message)
                except:
                    index = clients.index(client)
                    clients.remove(client)
                    client.close()
                    alias = aliases[index]
                    broadcast(f'{alias} has left the chat room!'.encode('utf-8'))
                    aliases.remove(alias)
                    break 
        

def start():
    server.listen()
    print(f"[LISTENING] Server is listening on {SERVER}")
    while True:
        client, addr = server.accept()
        print(f"[NEW CONNECTION] {addr} connected.")
        client.send('NAME?'.encode(FORMAT))
        alias = client.recv(1024)
        aliases.append(alias)
        clients.append(client)
        print(f'The clients is {alias}'.encode(FORMAT))
        thread = threading.Thread(target= handle_client, args=(client, addr))
        thread.start()


print ('[STARTING] server is starting')
start()

客户端

import threading
import socket
name = input('NAME? ')
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('0.0.0.0', 1026))


def client_receive():
    while True:
        try:
            message = client.recv(1024).decode('utf-8')
            if message == "NAME?":
                client.send(name.encode('utf-8'))
            else:
                print(message)
        except:
            print('Error!')
            client.close()
            break


def client_send():
    while True:
        message = f'{name}: {input("")}'
        client.send(message.encode('utf-8'))


receive_thread = threading.Thread(target=client_receive)
receive_thread.start()

send_thread = threading.Thread(target=client_send)
send_thread.start()

I want to create a TCP server which can send specific messages to specific clients. In my example, I have two clients Iconet and Robot. I want to send specific messages to each of these clients once they are connected. I wish to send VITAi and VITAr to the clients respectively. Once i receive the response from the two clients i wish to jump to def chat() The aim is to get the response from clients and then jump to def chat() which acts like a chat room and displays the messages the clients have sent. How can i achieve this?

server


import threading 
import socket 

PORT = 1026
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER,PORT)
FORMAT = "utf-8"
HEADER = 1024
DISCONNECT_MESSAGE = "END_CYCLE"
VITA_R = "yes"
VITA_I = "yes"
robot_flag = False
iconet_flag = False

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)
clients = []
aliases = []
alias_dictionary_iter = zip(aliases,clients)
alias_dictionary = dict(alias_dictionary_iter)

def broadcast(broadcast_message):
    for client in clients:
        client.send(broadcast_message)

def handle_client(client,addr):
    print(f"[NEW CONNECTION] {addr} connected.")
    connected = True
    while connected:
        for client in clients:
         if client == clients[0]:
            robot_message = 'VITAr'
            client.send(robot_message.encode(FORMAT))
            robot_response = client.recv(2048).decode(FORMAT)
            print(robot_response)
            if robot_response == VITA_R:
                robot_flag == True
            else:
                robot_flag == False
          
         elif client == clients[1]:
            iconet_message = 'VITAi'
            client.send(iconet_message.encode(FORMAT))
            iconet_response = client.recv(2048).decode(FORMAT)
            print(iconet_response)
            if iconet_response == VITA_I:
                iconet_flag == True
            else:
                iconet_flag == False
                    
def chat(client):
            while robot_flag & iconet_flag == True:
                try:
                    message = client.recv(1024)
                    broadcast(message)
                    print(message)
                except:
                    index = clients.index(client)
                    clients.remove(client)
                    client.close()
                    alias = aliases[index]
                    broadcast(f'{alias} has left the chat room!'.encode('utf-8'))
                    aliases.remove(alias)
                    break 
        

def start():
    server.listen()
    print(f"[LISTENING] Server is listening on {SERVER}")
    while True:
        client, addr = server.accept()
        print(f"[NEW CONNECTION] {addr} connected.")
        client.send('NAME?'.encode(FORMAT))
        alias = client.recv(1024)
        aliases.append(alias)
        clients.append(client)
        print(f'The clients is {alias}'.encode(FORMAT))
        thread = threading.Thread(target= handle_client, args=(client, addr))
        thread.start()


print ('[STARTING] server is starting')
start()

client

import threading
import socket
name = input('NAME? ')
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('0.0.0.0', 1026))


def client_receive():
    while True:
        try:
            message = client.recv(1024).decode('utf-8')
            if message == "NAME?":
                client.send(name.encode('utf-8'))
            else:
                print(message)
        except:
            print('Error!')
            client.close()
            break


def client_send():
    while True:
        message = f'{name}: {input("")}'
        client.send(message.encode('utf-8'))


receive_thread = threading.Thread(target=client_receive)
receive_thread.start()

send_thread = threading.Thread(target=client_send)
send_thread.start()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文