2017-03-04 75 views
0

在下面的代碼中,在第一次執行方法期間發生連接,但從第二次執行線程內的函數時,accept()函數不接受任何功能,它只是停留在提示下,即使我從其他本地設備連接也不做任何事情。任何幫助將是非常有用的。這是代碼。我對線程真的很陌生。所以請糾正我的錯誤,並對我的代碼中的任何錯誤進行全面的說明。從線程調用時,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-true循環中運行線程的目標。我還建議你組織你的代碼,以便更好地理解。

def mythread(): 
     while True: 
       accept() 

記住,總是傳遞變量作爲自變量所以沒有留下