Сервер не завершен - PullRequest
       3

Сервер не завершен

0 голосов
/ 13 декабря 2018

Я использую потоки, чтобы сервер прослушивал как 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 голосов
/ 13 декабря 2018

проблема в том, что вы запускаете 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():

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...