【问题标题】:Python Socket Server Can Only Handle 1 Client at a timePython Socket 服务器一次只能处理 1 个客户端
【发布时间】:2016-08-16 01:10:44
【问题描述】:

我正在尝试使用线程制作一个服务器-客户端程序来处理每个客户端,但服务器一次只能接受一个客户端。如果第一个客户端断开连接,则接受第二个客户端。而且,每个客户端只能发送一次数据,然后程序就发送失败了。

在发布之前,我查看了许多其他 Stack Overflow 帖子,包括以下内容:

how can I make a server communicate with more than 1 client at the same time?

python multithreaded server

My Python socket server can only receive one message from the client

但是通过查看这些帖子我没有找到解决方案。

这是服务器代码:

import socket
from threading import *


def main():

    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('172.20.3.62', 5000))
    s.listen(1)
    clients = []
    print("listening")

    def clienthandler(c):
        clients.append(c)
        try:
            while True:
                data = c.recv(1024).decode("UTF-8")
                if not data:
                    break
                else:
                    print(data)
                    for client in clients:
                        client.send(data.encode("UTF-8"))
        except:
            clients.remove(c)
            c.close()

    while True:
        c, addr = s.accept()
        print("accepted a client")
        Thread(target=clienthandler(c)).start()

if __name__ == '__main__':
    main()

这是客户端代码:

import socket
from threading import *


def main():
    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('172.20.3.62', 5000))
    print("connected")
    def send():
        msg = input("ENTER:")
        s.send(msg.encode("UTF-8"))

    def receive():
        while True:
            data = s.recv(1024).decode("UTF-8")
            if data:
                print(data)
            else:
                break

    Thread(target=send).start()
    Thread(target=receive).start()

if __name__ == '__main__':
    main()

【问题讨论】:

  • Thread(target=clienthandler(c)) -> Thread(target=clienthandler, args=(c,))
  • @Rawing 非常感谢!你完美解决了!另外,我解决了客户端只发送一次,忘了把它放在一个循环中。

标签: python multithreading sockets


【解决方案1】:

感谢用户 Rawing。他/她的解决方案是:Thread(target=clien‌​thandler(c)) -> Thread(target=clien‌​thandler, args=(c,)) 这允许多个线程,并且我能够通过将客户端发送块放在 while 循环中来解决唯一的消息问题。

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多