2017-03-04 2 views
0

Die Verbindung passiert während der ersten Ausführung der Methode im folgenden Code, aber ab dem zweiten Mal Ausführung der Funktion innerhalb des Threads, ist die accept() -Funktion nicht Wenn ich irgendeine Funktion akzeptiere, bleibt sie nur bei der Eingabeaufforderung und macht nichts, selbst wenn ich von anderen lokalen Geräten aus eine Verbindung herstelle. Jede Hilfe wäre wirklich hilfreich. Hier ist der Code. Ich bin wirklich neu im Threading. Bitte korrigieren Sie meine Fehler und geben Sie eine vollständige Erklärung für Fehler in meinem Code.Python-Socket accept() funktioniert nicht beim Aufruf aus einem Thread

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() ; 

Antwort

0

Spin off Fäden nur den Client für die Wartung. Jetzt starten Sie jedes Mal einen anderen Server, wenn ein Client eine Verbindung herstellt. Versuchen Sie dies:

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

Sie sollten das Ziel des Threads innerhalb einer While-True-Schleife ausführen. Ich schlage auch vor, dass Sie Ihren Code zum besseren Verständnis organisieren.

def mythread(): 
     while True: 
       accept() 

Denken Sie daran, immer die Variablen als Argumente übergeben, so dass nichts übrig bleibt hinter

Verwandte Themen