2017-11-08 6 views
0

複数のクライアントがサーバに接続できるようにしようとしていますが、2人のユーザが接続すると、ソケットと私はこれの周りに何かがあった場合疑問に思っていた。複数の人がソケットにPythonで接続しようとしている

server.py

import socket 

def Main(): 
    host = '10.41.13.228' 
    port = 5000 


    s = socket.socket() 
    s.bind((host,port)) 

    s.listen(1) 


    name = input("Please Enter your name - ") 
    while True: 
     c, addr = s.accept() 
     print("Connection from: " + str(addr)) 
     data = c.recv(1024).decode('utf-8') 
     print(data) 
    c.close() 

if __name__ == '__main__': 
    Main() 

Client.py

import socket 

def Main(): 
    host = '10.41.13.228' 
    port = 5000 

    s = socket.socket() 
    s.connect((host, port)) 


    name = input("Please enter your name - ") 
    message = input("-> ") 
    while True: 
     while message != 'q': 
      ToSend = (str(name) + " - " + str(message)) 
      s.sendall(ToSend.encode('utf-8')) 
      message = input("-> ") 
     s.close() 

if __name__ == '__main__': 
    Main() 

答えて

0

私はあなたのコードに気づいた問題がs.listen方法です。クライアント接続を1つだけ聞いているところ。サーバーに接続するクライアントの数を増やすことができます。

0

docs、実施例で説明したように:

サーバシーケンスソケットを(実行する必要があることに注意)、バインド()、(リッスンする)、(受け入れる)は(おそらく(受け入れる繰り返す)に1つ以上のクライアントにサービスを提供する)、クライアントはシーケンスsocket()、connect()だけを必要とします。また、サーバはlistenしているソケット上でsendall()/ recv()を実行しませんが、accept()によって返された新しいソケット上にあることに注意してください。

したがって、コードには2つの欠落部分があります。

  1. 既にコメントされているように、listen()メソッドは2つの引数を取る必要があります(2つのクライアントを持つ予定です)。
  2. accept()を2回呼び出す必要があります。この例のコメントを覚えておいてください。再び引用:サーバがsendall()/ RECV()それは リッスンしているソケットのが、(受け入れによって返された新しいソケットでないこと

    ノート)のうち

をトピック。一度受信したサーバーのループから切り離すには、「exit」などのキーワードを使用することをお勧めします。

関連する問題