繁体   English   中英

有没有办法向除了发件人之外的所有人发送消息?

[英]Is there any way to send a message to everyone except the sender?

这个问题与这个问题类似,但那是针对 JavaScript 的,而我的则是针对 Python 的。

如何使用套接字库从服务器向每个连接的客户端发送消息,除了 Python 中的选定客户端?

我正在制作一个简单的游戏,我想在三个客户端中检测到第一个按下按钮的人,然后通知其他两个客户端他们输了,同时通知获胜者他们赢了。

通常,要将信息发送给您所做的客户(在新线程上):

connected_client.sendall(data)

要接收,您可以:

data = socket.recv()

但是从我搜索的内容来看,除了某个客户端之外,我找不到将数据发送到每个连接的客户端的方法。

我想我可以通过为每个运行接收功能的线程创建一个“识别名称”来解决这个问题,但是我找不到一个好的方法来做到这一点,因此我决定寻找一个更好的选择。

我怎样才能做到这一点?

将它们插入列表会有所帮助。 例如...

对于服务器端:

import socket
import threading

# This is where you store all of your Client IP's
client_list = []

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_ip = "yourip"
server_port = 8888
server.bind((server_ip, server_port))

def check_client(client_ip):
    while True:
        data = client_ip.recv(1024).decode()
        
        if "condition" in data:
            for ip in client_list:
                if ip != client_ip:
                    ip.send("something".encode())

def check_connection():
    server.listen()
    while True:
        client_ip, client_address = server.accept()
        client_list.append(client_ip)
        threading.Thread(target=check_client, args=(client_ip,), daemon=True).start()

check_connection()

所以会发生什么是你调用check_connection函数来检查传入的连接。 接收到一个后,它将连接附加到client_list变量中。 同时,它为当前连接创建一个线程check_client ,用于检查正在发送的任何信息。 如果您的一位客户正在发送信息,它会检查"condition"字符串是否在您发送的数据中。 如果是这样,它会将"something"字符串发送到您的所有客户端,但自身除外。 请注意,当您发送数据时,它必须以bytes为单位。

对于客户端:

import socket
import threading

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_ip = "serverip"
server_port = 8888
server.connect((server_ip, server_port))


def receive_info():
    while True:
        data = server.recv(1024).decode()

        if "something" in data:
            print("Someone already sent something")


threading.Thread(target=receive_info, daemon=True).start()

while True:
    user_input = input("Type 'condition': ")
    server.send(user_input.encode())

这只会将您的输入发送到服务器。 如果您在输入中键入"condition" ,它将在除您之外的其他客户端上发送"something" 因此,您需要再设置 2 个客户端才能看到结果。

不要忘记设置server_ipserver_port的值!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM