【问题标题】:Is it possible to receive data on the same IP and port simultaneously是否可以同时在同一 IP 和端口上接收数据
【发布时间】:2019-04-14 15:57:27
【问题描述】:

我正在努力做到这一点,以便在我的客户端-服务器程序中的任何时候,如果客户端希望退出程序,它会发送无论时间如何服务器都能够接收的数据。

为此,我尝试使用线程在后台运行一个线程,该线程在后台“退出”侦听数据 虽然在我的代码的非线程部分,它只是像往常一样接收数据

这是我的尝试,(当然)没有成功

客户:

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

【问题讨论】:

    标签: python-3.x sockets python-multithreading


    【解决方案1】:

    这通常不是通过多线程来解决,而是通过更多层来解决。您只需创建一个附加层,它将仅检查退出词。如果处理字没有退出,则将字传递给上层(您的应用程序逻辑)。如果是,那么不要传递任何东西,直接退出程序。

    【讨论】:

    • 唯一的问题是我的实际程序在多个点(由另一个函数或方法调用的函数或方法)接收数据,并且在那里找到了对退出的正确响应。你建议我完全重构我的代码还是?
    • @JamesGreen 我认为这是最好的解决方案。接收逻辑应该封装在一个地方,至少对于适当的 OOP 架构来说是这样。这实际上是另一层,最低的一层。
    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多