2017-03-04 80 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() 

记住,总是传递变量作为自变量所以没有留下