2016-08-15 5 views
0

スレッドを使用して各クライアントを処理するサーバクライアントプログラムを作成しようとしていますが、サーバは一度に1クライアントしか受け付けません。最初のクライアントが切断すると、2番目のクライアントが受け入れられます。さらに、各クライアントはデータを1回しか送信できず、プログラムはそれ以上送信できません。Pythonソケットサーバは一度に1クライアントしか処理できません

投稿する前に、私は以下を含む、他の多くのスタックオーバーフローの記事を見てきました:

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() 

は、クライアントコードは次のとおりです。ユーザーRawingへ

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() 
+0

'Thread(target = clienthandler(c))' - > 'Thread(target = clienthandler、args =(c、))' –

+0

@Rawingそんなにありがとう!あなたはそれを完全に解決しました!また、クライアントを一度だけ送信して解決し、ループに入れるのを忘れてしまった。 – ajflj

答えて

0

感謝。彼/彼女の解決策は次の通りです:Thread(target = clien thandler(c)) - > Thread(target = clien thandler、args =(c、)) これは複数のスレッドを許していました。クライアントのsendブロックをwhileループに入れることで、メッセージの問題が1つだけ発生します。

関連する問題