当前位置: 首页 > 知识库问答 >
问题:

Python套接字-多个客户端到一台服务器,连接错误或线程错误?

南门峰
2023-03-14

我正在尝试用python创建一个p2p聊天。这个想法是让客户端在出现故障时能够成为服务器。这是为了学习目的,所以我只是在我的笔记本电脑上本地做这个。

但到目前为止,我正在努力实现客户端和服务器之间的通信。

我为服务器打开了一个终端窗口。2个客户端终端窗口。

如果我连接两个客户端,它们都可以向服务器发送消息,服务器将消息广播给所有客户端。但在第二个客户端发送一条消息后,只有一个客户端可以发送消息,但服务器会打印出两个客户端的端口。

输出示例:https://i.imgur.com/nJrycos.png

我疯狂地谷歌了一下。我尝试将套接字创建放在while循环中(参见下面的代码)。

class Server:
    connections = []

    def __init__(self):
        print("server created")

        # I have tried putting this part in the while loop below
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        hostname = socket.gethostname()
        host = socket.gethostbyname(hostname)
        port = 5001
        sock.bind((host, port))
        print("Hosting server on " + host + ":" + str(port) + " hostname: " + hostname)

        sock.listen(1)  # I have tried changing the value from 1 to 2, 5, 10 etc but no difference

        while True:
            connection, client_address = sock.accept()
            print(str(client_address) + " connected!")

            # create new thread
            listener_thread = Thread(target=self.server_listener, args=(connection, client_address))
            listener_thread.daemon = True
            listener_thread.start()

            self.connections.append(connection)


    def server_listener(self, connection, client_address):
        while True:
            chunk = connection.recv(1024)
            if not chunk:
                print(str(client_address) + " disconnected")
                break
            elif chunk[0:3] == b'msg':
                # Send out message to other clients connected
                for connection in self.connections:
                    connection.send(chunk[3:].decode())

            print(str(client_address) + ':' + chunk[3:])

我的客户机类基本上是相同的,但使用connect而不是bind。客户端还有一个线程方法,用于侦听服务器消息。

我没有收到任何错误消息,所以我甚至不知道线程或网络部分是否有任何问题。

我希望服务器能够有多个线程,能够连接多个客户端,并且能够进行通信。

共有1个答案

隆选
2023-03-14

您正在覆盖中的连接


    def server_listener(self, connection, client_address):
        ...
            elif chunk[0:3] == b'msg':
                # Send out message to other clients connected
                for connection in self.connections: << HERE 
                    connection.send(chunk[3:].decode())

更改self中的连接。连接到自身中的c。连接并尝试。

 类似资料:
  • 如何处理多个客户端连接到一个服务器?我有这个logserver.java 和一个嵌入式applet,其中包含如下所示的部分代码,例如 现在的问题是,如果我在服务器上运行“Java日志服务器”,它将打开应用程序并等待输入流,如果我打开我的站点,它将开始流日志。但如果我使用其他计算机/网络再打开一个站点,第二个站点不会记录流。似乎是因为第一个仍然绑定到端口5000。 我该怎么处理?socket实际上是

  • 问题内容: 如何处理多个客户端以连接到一台服务器?我有这个LogServer.java 和一个嵌入式小程序,其中包含部分代码,例如 现在的问题是,如果我在服务器上运行“ java LogServer”,它将打开应用程序并等待输入流,如果打开站点,它将开始流式传输日志。但是,如果我使用其他计算机/网络再打开一个,则第二个站点不会记录该流。似乎是因为第一个仍绑定到端口5000。 我该如何处理?套接字实

  • 真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。

  • Java: 在C#中-它停止在“receiver=listener.accept();”在java(android)中-它停止于“sender_socket=new Socket(serverAddr,SERVERPORT);”这应该是java套接字函数的问题--需要另一个函数连接到C#-server。

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接