es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python envía <\n> a través de un socket TCP.

Tenemos una cadena que debe ser enviada a un servicio a través de un websocket. Esta cadena contiene algunos datos que están separados por etiquetas. Una fila de datos siempre termina con <\r><\n>.

Entonces queremos enviar cada fila de datos a este servicio que está implementado como un TCPServer. Esto funciona perfectamente bien en caso de que usemos cadenas normales, pero tan pronto como intentamos incorporar las etiquetas mencionadas, Python simplemente las sigue agregando en un bucle infinito y las envía como una sola cadena enorme cuando se sale del bucle:

Considere la siguiente implementación:

import random
from datetime import datetime
import time
import socket
import sys

HOST = "xx.xx.xx.xx"
PORT = 12345
srv = (HOST, PORT)

cls = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
cls.connect(srv)


# DATA:


# Variable to change status text
dec = 0
while 1:
    data = "foo\\nbar"
    size = cls.send(data.encode())
    print(size)
    time.sleep(1)

Entonces la cadena se construye en Python hasta que salgo del bucle manualmente a: foo\\nbarfoo\\nbarfoo\\nbarfoo\\nbarfoo\\nbarfoo\\nbarfoo\\nbar y se envía al socket.

Lo que queremos lograr es que esas cadenas se envíen una después de la otra como:

foo\nbar
foo\nbar
foo\nbar

¿Existe alguna posibilidad de enviar esos caracteres especiales junto con la cadena?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay posibilidad de enviar esos caracteres especiales junto con la cadena. En lugar de usar los caracteres de escapada “\r” y “\n”, podemos usar los caracteres ASCII reales para retorno de carro y avance de línea, respectivamente. El código ASCII para retorno de carro es 13 y para avance de línea es 10. Por lo tanto, podemos modificar la cadena de la siguiente manera:

    data = "foo" + chr(13) + chr(10) + "bar" + chr(13) + chr(10)
    

    Esto añadirá los caracteres de retorno de carro y avance de línea a la cadena, y cuando esta cadena se envíe al TCPServer, el servidor los tratará como filas de datos separadas.

Comments are closed.