Можно ли получать данные на один и тот же IP-адрес и порт одновременно? - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь сделать так, чтобы в любой точке моей клиент-серверной программы, если клиент желает выйти из программы, он отправлял данные, которые сервер сможет получить независимо от времени.

Чтобы сделать это, я попытался использовать многопоточность, чтобы запустить поток в фоновом режиме, который прослушивает данные, «выходящие» в фоновом режиме. Хотя в непоточной части моего кода он просто принимает данные как обычно

Вот моя попытка, которая (конечно) не сработала

Клиент:

import socket

host = str(socket.gethostbyname(socket.gethostname()))  # Gets local IP so I don't have to keep changing
# host = "192.168.0.17"
port = 1000
ID = "__UserLogin123__"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
while True:
    x = input("Send QUIT? -> ").upper()
    if x == "Y":
        s.send(str.encode("QUIT"))
    else:
        s.send(str.encode("foo"))

Сервер:

import socket
import queue
from threading import Thread

def foo(conn):
    while True:
        x = conn.recv(2048).decode()
        if x == "QUIT":
            return True
        if x == "foo":
            print("hollo")


result = False
port = 1000
host = str(socket.gethostbyname(socket.gethostname()))
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)
conn, addr = s.accept()
que = queue.Queue()
connThread = Thread(target=lambda q, arg1: q.put(foo(arg1)), args=(que,conn))
connThread.start()

while not result:
    print("Waiting")
    test = conn.recv(2048).decode()
    if test == "foo":
        print("hi")
    result = que.get()

1 Ответ

0 голосов
/ 12 ноября 2018

Обычно это решается не несколькими потоками, а несколькими слоями.Вы просто создаете дополнительный слой, который будет проверять только слово выхода.Если слово обработки не завершено, передайте слово на верхние уровни (логика вашего приложения).Если да, то ничего не пропустите и просто выйдите из программы.

...