从线程调用时,Python套接字accept()不起作用

时间:2017-03-04 01:39:21

标签: python multithreading sockets tcp

在下面的代码中第一次执行方法时发生连接,但是从第二次执行线程中的函数开始,accept()函数不接受任何functoin,它只是停留在提示符下即使我从其他本地设备连接也没有。任何帮助都会非常有帮助。这是代码。我对线程很新。因此,请纠正我的错误,并对我的代码中的任何错误进行全面解释。

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

2 个答案:

答案 0 :(得分:0)

你应该在while-true循环中运行线程的目标。我还建议您整理代码以便更好地理解。

def mythread():
        while True:
               accept()

请记住始终将变量作为参数传递,以便不遗漏任何内容

答案 1 :(得分: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()