@Flipzy
Веб-разработчик

Возможно ли подключиться к ранее закрытому сокету?

Всем привет, столкнулся с такой проблемой. Суть задачи такая: я по TCP подключаюсь к контроллеру, контроллер проводит тесты своих систем и кидает мне результаты этих тестов. Я эти данные принимаю через сокет, обрабатываю и вывожу на экран проги. Соответственно после окончания тестов я закрываю сокет и поток приёма данных вырубается. В проге есть кнопка перезапустить тестирование, она нужна, чтобы при замене контроллера не перезапускать программу. При нажатии на эту кнопку я перезапускаю поток приёма данных и, соответственно, пытаюсь подключиться к уже закрытому сокету и вижу такую ошибку
[WinError 10056] Сделан запрос на подключение для уже подключенного сокета
или
[WinError 10038] Сделана попытка выполнить операцию на объекте, не являющемся сокетом

так вот вопрос, как быть?

код:

Файл tcp_receive.py В нём как раз таки и находится сокет

import socket
from PyQt5.QtCore import QObject, pyqtSignal

class TCP_Receiver(QObject):
    connect_signal = pyqtSignal(bool)
    error_signal = pyqtSignal(str)
    
    def __init__(self):
        super().__init__()
        self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.stop_flag = False

    def kill(self):
        try:
            self.stop_flag = True
            self.client_socket.close()
        except Exception as e:
            print(f"Произошла ошибка при закрытии сокета: {e}")
        finally:
            print("Сокет успешно закрыт")

    def Connect_to_controller(self, data_queue):
        host = '10.55.6.170'
        port = 23

        try:
            print("Успешно подключено")
            self.client_socket.connect((host, port))
            print("Успешно подключено")
            self.connect_signal.emit(True)

            while not self.stop_flag:
                response = self.client_socket.recv(1440)
                data_to_send = "Ваши данные для контроллера"
                self.send_data_to_controller(data_to_send)
                print(response)
                data_queue.put(response)   
                
                if self.stop_flag == True:
                    break            
                
        except Exception as e:
            # error_message = "Тестирование успешно завершено!"
            # self.error_signal.emit(error_message)
            print(e)
            
        finally:
            print("Поток подключения к контроллеру завершен")

    def send_data_to_controller(self, data):
        try:
            self.client_socket.send(data.encode("utf-8"))  # Здесь data - это строка данных для отправки
            print("Данные успешно отправлены")
        except Exception as e:
            print(f"Произошла ошибка при отправке данных: {e}")



Если нужно будет, то могу докинуть код остальных файлов, просто хабр не даёт отправить больше 10к символов

ОСТОРОЖНО ВОЗМОЖЕН ГОВНОКОД!
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
К уже закрытому сокету подключиться нельзя. Создавайте новый, и уже к нему подключайтесь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@maximq
QA Engineer
Возможно не до конца понял суть проблемы. Но есть идея открыть порт для отстука, при получении запроса по нему поднимать сокет

на стороне сервера:
routes = web.RouteTableDef()

@routes.post('/websocket')
async def websocketUp(request):
    try:
        <здесь открываем сокет>
        print("Сокет открыт")
        return web.Response(text="success")
    except:
        print("Ошибка открытия сокета")
        return web.Response(text="error")

app = web.Application()
app.add_routes(routes)
web.run_app(app)

на стороне клиента сперва стучать в порт, затем подключаться к сокету
ну или в цикле
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы