Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何向多线程套接字服务器中的所有客户端发送广播数据?_Python_Multithreading_Sockets_Chatroom - Fatal编程技术网

Python 如何向多线程套接字服务器中的所有客户端发送广播数据?

Python 如何向多线程套接字服务器中的所有客户端发送广播数据?,python,multithreading,sockets,chatroom,Python,Multithreading,Sockets,Chatroom,我目前正在用python创建一个多线程聊天室,但是向所有客户端广播数据时遇到了问题 我希望创建一个系统,其中一个客户端向服务器发送数据,服务器向其他客户端广播数据 我希望达到的目标是: 服务器: import socket import threading import sys import time USERNAME = str(input("Enter your username: ")) MAX_CLIENTS = int(input("How many clients: ")) BU

我目前正在用python创建一个多线程聊天室,但是向所有客户端广播数据时遇到了问题

我希望创建一个系统,其中一个客户端向服务器发送数据,服务器向其他客户端广播数据

我希望达到的目标是:

服务器:

import socket
import threading
import sys
import time

USERNAME = str(input("Enter your username: "))
MAX_CLIENTS = int(input("How many clients: "))
BUFF_SIZE = 1024
HOST = ''
PORT = 9999

lock = threading.Lock()

class Server:
    def __init__(self):
        self.clients = [] #list of clients
        self.messages = [] #messages
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.host = HOST
        self.port = PORT
        self.sock.bind((self.host, self.port))
        threading.Thread(self.listener()).start()
    def conn_handler(self, conn):
        while True:
            with lock:
                self.data = conn.recv(BUFF_SIZE).decode("utf-8")
                print(data)
                self.messages.append(self.data)
                conn.sendall(self.data.encode("utf-8")) #error occurs here, cannot send data to all clients
                time.sleep(.01)
    def listener(self):
        for x in range(MAX_CLIENTS):
            self.sock.listen(1)
            conn, addr = self.sock.accept()
            print("{} has connected!".format(addr))
            self.clients.append(addr)
            threading.Thread(target=self.clientthread, args=(conn,)).start()
            threading.Thread(target=self.conn_handler, args=(conn,)).start()

server = Server()
客户:

import socket
import time
import threading

BUFF_SIZE = 1024
HOST = str(input("Enter Server IP: "))
PORT = 9999

print("Connecting to {} at port {}.\n".format(HOST, PORT))

lock = threading.Lock()

USERNAME = str(input("Enter username: "))

print("""\nClientCommands:
-----------------
\t1. @SHOWINFO --> Shows server info.
\t2. @ARCIVECHAT --> Saves chat into text file.
""")

class Client:
    def __init__(self):
        self.messages = []
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.host = HOST
        self.port = PORT
        self.sock.connect((self.host, self.port))
        print("\nConnected to server!\n")
        print("Please press <enter> to refresh chat in order to send message.")
        _recver = threading.Thread(target=self.recver)
        _recver.start()
    def recver(self):
        while True:
            with lock:
                data = self.sock.recv(BUFF_SIZE).decode("utf-8")
                print(data)
                self.messages.append(data)
                data = self.sock.recv(BUFF_SIZE).decode("utf-8")
                print(data)
                self.messages.append(data)
                time.sleep(.01)
    def get_send_msg(self):
        self._msg_to_send = str(input("You - "))
        self.msg_to_send = "{} - ".format(USERNAME)+self._msg_to_send
        self.messages.append(self.msg_to_send)
        try:
            if self._msg_to_send == "@SHOWINFO":
                self.ShowInfo()
            elif self._msg_to_send == "@ARCIVECHAT":
                self.Arcive_Chat()
            else:
                self.sock.send(self.msg_to_send.encode("utf-8"))
        except Exception as e:
            print("An error has occured:")
            print(e)
            archiveornot = str(input("Would you like to archive the conversation in a text file(Y/N): "))
            if archiveornot == "Y":
                archive_name = str(input("Enter file name: "))
                f = open(archive_name, "w")
                for message in self.messages:
                    f.write("\n")
                    f.write(message)
                f.close()
                print("Exiting program...")
                quit()
            else:
                print("Exiting program...")
                time.sleep(2)
                quit()
        time.sleep(.01)
    def ShowInfo(self):
        print("Server Info:")
        print("--------")
        print("Host: {} | Port: {}".format(self.host, self.port))
        print("--------")
    def Arcive_Chat(self):
        archive_name = str(input("Enter file name: "))
        f = open(archive_name, "w")
        if len(self.messages) >= 1:
            for message in self.messages:
                f.write("\n")
                f.write(message)
            f.close()
        else:
            print("[!]Error, No messages were sent[!]")


client = Client()

def main():
    while True:
        client.get_send_msg()

if __name__ == "__main__":
    main()

接受客户端时,应将conn套接字存储在服务器对象中。在服务器中重新发送接收到的消息时,您必须循环通过套接字并将消息发送到除您从中接收到消息的套接字之外的每个套接字。您可以给出一个示例吗?这只是server.conn\u处理程序中的for循环,用于为所有客户端的conn调用conn.sendall