Сокет с циклами if не дает последовательного результата - PullRequest
1 голос
/ 09 марта 2019

Программа постоянно получает данные от отправителя.И у меня есть кнопка с галочкой / без галочки, когда я проверяю, что она запускает часть if ... это хорошо.Теперь я отключаю его, затем else часть запускается и печатает Unchecked going to close socket, но s.shutdown(10) & s.close() не закрывая сокет, это показывает, что ошибка s.shutdown (10) не является объектом сокета ОС [Errno10022] указан неверный аргумент Почему он не закрывает сокет или есть другой способ его закрытия.

Дополнительное требование

если мой сокет снова закрывается, я хочу проверить его (во второй раз), чтобы снова запустить if part для получения данных от компьютера отправителя.возможно снова запустить сокет, не закрывая мою программу.

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. 1-й раз нажмите на кнопку ---> Проверено и если часть запускается [работает]

  2. 2-й раз нажмите на кнопку ---> Не отмечена и еще часть запуска, чтобы закрыть сокет [не закрывается]

  3. 3-ий раз нажмите на кнопку ---> еще раз проверил и получил данные с компьютера отправителя [возможно ли]

1 Ответ

3 голосов
/ 11 марта 2019

Как только сокет был закрыт или закрыт, вы не можете восстановить его, но должны создать новый.

Общий дизайн должен быть следующим:

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 редко используется вне грациозного отключения 1012 *, которое здесь не полностью реализовано.

...