2017-04-09 3 views
0

次のように私の現在のコードは次のとおりです。Pythonのソケット - スレッドを閉じると、できるようにし、より多くのユーザー

from socket import * 
import threading 
import datetime 
import csv 
import time 

global clist 
clist = [] 

HOST = "ip" 
PORT = 1876 
s = socket(AF_INET, SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(5) 

def clientHandler(): 
    print("Thread successful\n") 
    connect, address = s.accept() 
    clist.append(connect) 
    iplist = open("iplist.txt","a+") 
    iplist.write(str(address)+"\n") 
    iplist.close() 
    print('IP Recorded.') 
    while 1: 
     try: 
      data = connect.recv(1024) 
      data = data.decode() 
      current_date = time.strftime("%d-%m") 
      log = open(current_date+"log.txt","a+") 
      print("("+time.strftime("%H:%M:%S")+")","> ", data) 
      log.write("> "+data+"\n") 
      log.close() 
      data = data.encode() 
      for item in clist: 
       item.sendall(data) 
     except: #handles clients leaving and fixes reconnect bug, succesfully removing them from clist 
      clist.remove(connect) 
      print(address, 'has disconnected.') 
      break 



print("Server started...") 
for i in range(5): 
    makeThread = threading.Thread(target=clientHandler) 
    makeThread.start() 


aliveList = threading.enumerate() 
print(aliveList) 

私の問題は、クライアントが(X5)に参加または再参加後、サーバーがこれ以上の接続を許可しないことである(なぜなら私のclientHandler関数のスレッドが使用されています)。私はスレッドを閉じなければならないでしょうか、また、より多くのクライアントが参加/再結合できるように再利用可能にする方法はありますか? (どのように私はこれを行うだろうか?) また、私は非常にこのすべてに新しいので、誰も私のコードの改善/ソケットプログラミングと正しい道で私をガイドすることをお勧めできます。

喜んで助けてください、

歓声。

答えて

0

threading.activeCount()を使用してスレッドを列挙することをお勧めします。
はあなたが最大、そしてactiveCount()は< = 6(5クライアントとメインスレッド)
はこのループしてみなければなりません5つのクライアントをしたいとしましょう:今すぐ

while True : 
    try : 
     if threading.activeCount() < 6 : 
      makeThread = threading.Thread(target=clientHandler) 
      #makeThread.daemon = True ## uncomment this line if you want your threads to terminate when the main thread dies ## 
      makeThread.start() 
      print('Active clients: {}'.format(threading.activeCount() - 1)) 
    except KeyboardInterrupt : 
     print('terminated') 
     break 

をするときclientHandler()戻り、次のクライアントの余地があります。

+0

こんにちはt.m.adam遅い返事を申し訳ありませんが、私はあなたが言ったことを試みましたが、それはまだ5つのクライアントが接続することができますし、それらが切断されても、これ以上のヘルプは、ゴールデンであり、ありがとう – montymagic9

+0

私はコードを更新しました、今は大丈夫です。 –

+0

再度 'KeyboardInterrupt'をキャッチするように更新されました(ループを中断したい場合)。 'makeThread.daemon'の問題を修正しました。 –

関連する問題