具有if循环的套接字无法给出一致的结果

时间:2019-03-08 21:58:48

标签: python python-3.x sockets networking qgis

程序正在不断从发送方接收数据。当我选中它时,我有一个选中/未选中的按钮,它运行if部分...很好。现在我将其取消选中,然后else部分运行并打印Unchecked going to close socket,但是s.shutdown(10)s.close()没有关闭套接字,它显示了错误s.shutdown(10)不是套接字对象操作系统[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. 第三次单击按钮--->再次检查并从发送方计算机接收数据[可能]

1 个答案:

答案 0 :(得分: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模块提供的常量。接下来的shutdown很少在graceful shutdown之外使用,此处未完全实现。