Сокет с циклами if не дает последовательного результата

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

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

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

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

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


person Rahul Verma    schedule 08.03.2019    source источник
comment
См. здесь и здесь   -  person B. Shefter    schedule 09.03.2019
comment
@B.Shefter оба вопроса, заданные мной, только это не то решение, которое мне нужно.   -  person Rahul Verma    schedule 09.03.2019
comment
@t.m.adam пожалуйста, посмотри сюда   -  person Rahul Verma    schedule 09.03.2019
comment
Я предполагаю, что ваш сокет закрыт, и вы не подключаетесь снова.   -  person Michael    schedule 11.03.2019
comment
@ Майкл, которого я спросил, могу ли я подключаться или отключаться столько раз, сколько захочу в программе. есть ли способ снова получить данные после отключения.   -  person Rahul Verma    schedule 11.03.2019


Ответы (1)


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

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

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 редко используется вне мягкого завершения работы, которое здесь реализовано не полностью.

person Serge Ballesta    schedule 11.03.2019