带有 if 循环的套接字不会给出一致的结果

Socket with if-loops does not give a consistent result

程序正在不断地从发送端接收数据。我有一个 checked/unchecked 按钮,当我检查它时 运行 是 if 部分...这很好。现在我取消选中 else 部分 运行s 并打印 Unchecked going to close socket,但是 s.shutdown(10) & s.close() 没有关闭显示 的套接字错误 s.shutdown(10) 不是套接字对象 OS [Errno 10022] 提供了无效参数 为什么它不关闭套接字或是否有其他方法可以关闭它。

附加要求

如果我的套接字再次关闭,我想再次检查(第二次)到 运行 if 部分以从发送方计算机接收数据是否可以在不关闭我的情况下再次启动套接字程序。

def show_markers(self):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostbyname('192.168.225.12')
    s.connect((host, port))
    scale=0

    while True:

        if self.iconAction.isChecked():
            print ('Checked')
            m = QgsVertexMarker(self.iface.mapCanvas())
            data = s.recv(SIZE)
            data1 = s.recv(SIZE)
            c = data.decode()
            d = data1.decode()
            x = float(c)
            y = float(d)
            print("printing X :", x)
            print("printing Y :", y)
            rect = QgsRectangle(float(x)-scale, float(y)-scale, float(x)+scale, float(y)+scale)
            me = self.iface.mapCanvas()
            me.setExtent(rect)
            me.refresh()
            m.setCenter(QgsPointXY(x, y))
            m.setColor(QColor(255, 0, 0))
            m.setIconSize(7)
            m.setIconType(QgsVertexMarker.ICON_X)  # or ICON_CROSS, ICON_X
            m.setPenWidth(3)

        else:
            print('Unchecked going to close socket')
            s.shutdown(10)
            s.close()

我假设它应该像这样工作:

  1. 第一次点击按钮 ---> 已检查,如果部分 运行 [有效]

  2. 第二次单击按钮 ---> 未选中 & 其他部分 运行 关闭套接字 [不关闭]

  3. 第 3 次单击按钮 ---> 再次检查并从发送方计算机接收数据 [是否可能]

一旦套接字被关闭或关闭,您将无法恢复它,而必须创建一个新套接字。

总体设计应该是:

def show_markers(self):
    scale=0
    active_socket = False

    while True:

        if self.iconAction.isChecked():
            print ('Checked')
            if not active_socket:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                host = socket.gethostbyname('192.168.225.12')
                s.connect((host, port))
                active_socket = True
            ...
        else:
            if active_socket:
                print('Unchecked going to close socket')
                s.shutdown(10)               # ??
                s.close()
                active_socket = False

我已将 shutdown 行标记为询问,因为我无法理解您在这里要做什么。首先出于可移植性的原因,您应该 永远不要 使用数值,而只能使用 socket 模块提供的常量。 Next shutdown 很少在 graceful shutdown 之外使用,此处未完全实现。