【问题标题】:Socket only accepts one ConnectionSocket 只接受一个 Connection
【发布时间】:2022-01-02 08:38:33
【问题描述】:

我的多线程 Python 套接字聊天只接受一个连接。如果我尝试连接第二个客户端,它不起作用。在客户端,似乎一切正常,但如果我尝试从客户端 2 发送第二条消息,则消息不会到达。

import socket
import threading

class TxtSocket:
    
    def __init__(self, host="127.0.0.1" , port=5555):
        self.host = host
        self.port = port
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.bind((self.host, self.port))
        print("Socket was created")
        

    def server(self):
        self.s.listen()
        print("Server is listening")
        conn, addr = self.s.accept()
        print(f"{addr} is now connected.")
        while True:
            data = conn.recv(1024).decode("utf8")
            print(data)
            if not data:
                break
    

if __name__ == "__main__":
    txtsocket = TxtSocket()
    for i in range(0, 26):
        t = threading.Thread(target=txtsocket.server())
        t.start()

# Client
import socket

def Text():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 5555))
    print("Connected")
    while True:
        message = input("Deine Nachricht: ")
        message = message.encode("utf8")
        s.send(message)
Text()

【问题讨论】:

  • 当套接字获得新连接以支持多个客户端时创建一个新线程来处理客户端连接 - 发布的服务器代码适用于连接到服务器的多个同时客户端。
  • 如果答案有帮助,请随时投票,让其他人知道它很有用。另请注意,Python 有一个 SocketServer 模块,可以使服务器代码更简单。

标签: python sockets networking network-programming tuples


【解决方案1】:

需要对服务器添加几个模块来处理多个客户端。

  • 需要主循环来继续接受新连接并将处理分叉到一个线程
  • 当套接字获得新连接时,创建一个新线程来处理客户端连接。

以下服务器代码适用于上面指定的多个正在运行的客户端。

# server
import socket
import threading

class TxtSocket:
    
    def __init__(self, host="127.0.0.1", port=5555):
        self.host = host
        self.port = port
        self.thread = 0
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.bind((self.host, self.port))
        print("Socket was created")
        
    def handle(self, conn, addr):
        self.thread += 1
        print(f"Thread-{self.thread} {addr} is now connected")
        while True:
            data = conn.recv(1024)
            if not data:
                break
            print(data.decode("utf8"))
        conn.close()

    def server(self):
        # specify the number of unaccepted connections that the server
        # will allow before refusing new connections.
        self.s.listen(5)
        print(f'Server listening on tcp:{self.host}:{self.port}')
        while True:
            conn, addr = self.s.accept()
            # create new thread to handle the client connection
            t = threading.Thread(target=self.handle, args=(conn, addr))
            t.start()

if __name__ == "__main__":
    txtsocket = TxtSocket()
    txtsocket.server()

请注意,Python 有一个 SocketServer 模块,它可以通过一个可以完成大部分工作的 TCPServer 来简化其中的一些工作。见服务器example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2020-11-02
    • 1970-01-01
    • 2012-12-29
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多