Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

764
Views
Obtención de BrokenPipeError: [Errno 32] Tubería rota al enviar el segundo MSG de socket

Estoy tratando de enviar instrucciones desde un sitio web de Django a un robot (Raspberry Pi) usando Sockets, pero cada vez que intento enviar una segunda instrucción desde el sitio web, aparece el error. Si tiene alguna idea de qué está causando esto, ¡la ayuda sería increíble! Vista de envío del sitio web:

 def form_valid(self, form, **kwargs): robo_pk = self.kwargs['pk'] robo = Robot.objects.get(pk=robo_pk) PORT = robo.port SERVER = robo.server ADDR = (SERVER, PORT) self.object = form.save() client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(ADDR) def send(msg): message = msg.encode(FORMAT) msg_length = len(message) send_length = str(msg_length).encode(FORMAT) send_length += b' ' * (HEADER - len(send_length)) client.send(send_length) client.send(message) send(form.cleaned_data['path_options']) send("MESSAGE SENT :) !") send(DISCONNECT_MESSAGE) return render(self.request, "dashboard-home/thank-you.html")

RASTREO DE ERRORES:

 Traceback (most recent call last): File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner self.run() File "/usr/lib/python3.7/threading.py", line 865, in run self._target(*self._args, **self._kwargs) File "main.py", line 46, in handle_client conn.send("MSG Received".encode(FORMAT)) BrokenPipeError: [Errno 32] Broken pipe

Código relevante:

 def handle_client(conn, addr): print(f"[NEW CONNECTION] {addr} connected") connected = True while connected: msg_length = conn.recv(HEADER).decode(FORMAT) if msg_length: msg_length = int(msg_length) msg = conn.recv(msg_length).decode(FORMAT) if msg == '!DISCONNECT!': connected = False print("disconnect") break else: my_queue.put(msg) print(f"[{ADDR}] {msg}") conn.send("MSG Received".encode(FORMAT)) conn.close() def start(): server.listen() print(f"[LISTENING] Server Is Listening On {SERVER}") while True: print("before") conn,addr = server.accept() print("after") thread = threading.Thread(target=handle_client, args=(conn, addr)) thread.start() print(f"[ACTIVE CONNECTIONS] {threading.activeCount()}") print("[Starting] Server") threading.Thread(target=start).start() msg = my_queue.get()
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Está desconectando el cliente antes de recibir todos los mensajes. Para demostrar esto, ejecute de nuevo con conn.close comentado. Le falta lógica adicional para asegurarse de que todas las solicitudes pendientes se hayan procesado antes de cerrar la conexión.

Referencias

https://stackoverflow.com/a/11866962/806876

over 4 years ago · Santiago Trujillo Report

0

El cliente Django se desconecta inmediatamente después de enviar DISCONNECT_MESSAGE. El servidor detecta el cierre de la conexión e invalida el conector de conexión, lo que provoca la excepción. Esta invalidación puede ocurrir, por ejemplo, entre recv() para el mensaje "MENSAJE ENVIADO :)" y la respuesta del servidor (conn.send()) a este.

Consulte ¿Cómo manejar una tubería rota (SIGPIPE) en Python? para más información.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!