带有if循环的套接字不会产生一致的结果

问题描述 投票:1回答:1

该程序不断从发送方接收数据。当我检查它运行if部分时,我有一个选中/未选中的按钮......这很好。现在我让它取消选中然后else部分运行并打印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次点击按钮--->再次检查并从发送方计算机接收数据[是否可能]
python python-3.x sockets networking qgis
1个回答
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之外使用,这里没有完全实现。

© www.soinside.com 2019 - 2024. All rights reserved.