服务器未终止

时间:2018-12-13 15:29:17

标签: python sockets

我正在使用线程让服务器监听TCP和UDP消息。这是代码:

from threading import Thread
import time
import socket 

Listening_Port = 5005
Listening_IP = "127.0.0.1"

#define UDP listening function
def UDPListen():

    BUFFER_SIZE = 1024
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # IPv4, UDP
    sock.bind((Listening_IP, Listening_Port))
    while True:
        data, address = sock.recvfrom(BUFFER_SIZE)
        print "UDP Messsage from address: ", address
        print "Message: ", data

#define a TCP listening function
def TCPListen():
    BUFFER_SIZE = 1024
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # IPv4, TCP
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((Listening_IP, Listening_Port))
    while True:
        sock.listen(1)
        conn, address = sock.accept()
        print "TCP connection from", address
        data = conn.recv(BUFFER_SIZE)
        print "Mesage: ", data
        conn.close()

# main function
def main():

    ThreadUDP = Thread(target=UDPListen)
    ThreadTCP = Thread(target=TCPListen)

    print "Starting Server..."
    ThreadUDP.start()
    ThreadTCP.start()
    print "Server Started!"

if __name__ == "__main__":
    main()

问题是当我按ctrl + c(甚至多次)时,程序没有终止,我应该关闭控制台。

我为def main()尝试了类似的方法,但是没有用:

def main():

    ThreadUDP = Thread(target=UDPListen)
    ThreadTCP = Thread(target=TCPListen)
    try:
        print "Starting Server..."
        ThreadUDP.start()
        ThreadTCP.start()
        print "Server Started!"
    # Hit Break / Ctrl-C to exit
    except KeyboardInterrupt:
        print('\nClosing')
        raise

根据答案中提供的解决方案更新了代码:

from threading import Thread
import time
import socket 

Listening_Port = 5005
Listening_IP = "10.0.0.3"

#define UDP listening function
def UDPListen():

    BUFFER_SIZE = 1024
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # IPv4, UDP
    sock.bind((Listening_IP, Listening_Port))
    while not eve.isSet():
        data, address = sock.recvfrom(BUFFER_SIZE)
        print "UDP Messsage from address: ", address
        print "Message: ", data

#define a TCP listening function
def TCPListen():
    BUFFER_SIZE = 1024
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # IPv4, TCP
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((Listening_IP, Listening_Port))
    while not eve.isSet():
        sock.listen(1)
        conn, address = sock.accept()
        print "TCP connection from", address
        data = conn.recv(BUFFER_SIZE)
        print "Mesage: ", data
        conn.close()

# main function
def main():

    ThreadUDP = Thread(target=UDPListen)
    ThreadTCP = Thread(target=TCPListen)
    eve = threading.Event()
    print "Starting Server..."
    ThreadUDP.start()
    ThreadTCP.start()
    print "Server Started!"

    try:
        while True:
            eve.wait(2)
    except Exception:
        eve.set()

if __name__ == "__main__":
    main()

但是我收到一个错误:

NameError: Global name 'threading' is not defined

1 个答案:

答案 0 :(得分:0)

您遇到的问题是您在线程中运行listeners-意味着main中捕获的信号应该以某种方式向线程发出信号。

使用threading.Event,然后在主要功能中:

eve = threading.Event()
<start your threads>
try:
    while True:
        eve.wait(2)
except Exception
    eve.set()

,并且在线程而不是while True中使用while not eve.isSet():