2017-03-04 2 views
0

次のコードのメソッドの最初の実行中に接続が行われていますが、スレッド内の関数の2回目の実行からはaccept任意のfunctoinを受け入れるだけで、プロンプトにとどまり、他のローカルデバイスから接続しても何もしません。どんな助けでも本当に役立つだろう。ここにコードがあります。私は本当にスレッディングに新しいです。だから私の間違いを訂正し、私のコード内のエラーについて完全な説明をしてください。スレッドから呼び出されたときにPythonソケットaccept()が機能しない

def serverwaiter(): 
    myip = "192.168.1.2"; 
    port = 6027; 
    s = socket.socket(); 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1); 
    s.bind((myip, 6027)); 
    s.listen(10); 
    print("My ip :- {}".format(myip)) ; 
    cobj , addr = s.accept() ; 
    mythread = threading.Thread(target = serverwaiter, name = "TCP connection waiter {}".format(threading.active_count()-1)) 
    threads.append((cobj,addr)) ; 
    mythread.start() ; 
    print("Connected to {}".format(addr[0])) ; 
    data = cobj.recv(1024) ; 
    print("Host {} sent data = {}".format(addr, data)); 

    while(len(data)!=0): 
     print("Waiting for Data from {}".format(addr[0])) ; 
     data = cobj.recv(1024) ; 
     data = data.decode() ; 
     print("Host {} sent data = {}".format(addr ,data)) ; 

serverwaiter() ; 

答えて

0

スピン置き去りにされていないので、常に変数を引数として渡すことを忘れないでください。クライアントが接続するたびに別のサーバーを起動します。試してみてください:

import socket 
import threading 

def serverwaiter(): 
    port = 6027 
    s = socket.socket() 
    s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
    s.bind(('',6027)) 
    s.listen(10) 
    while True: 
     cobj,addr = s.accept() 
     mythread = threading.Thread(target=client,name='TCP client {}'.format(threading.active_count()-1),args=(cobj,addr)) 
     mythread.daemon = True # So client threads die on main thread exit. 
     mythread.start() 

def client(cobj,addr): 
    print('Connected to',addr) 
    while True: 
     data = cobj.recv(1024) 
     if not data: break 
     print('Host {} sent data = {}'.format(addr,data.decode())) 
    cobj.close() 

serverwaiter() 
0

whileループループ内でスレッドのターゲットを実行する必要があります。また、理解を深めるためにコードを整理することをお勧めします。

def mythread(): 
     while True: 
       accept() 

何もちょうど、クライアントにサービスを提供するためのスレッドオフ

関連する問題