socketio socket realtime sockets networking tcp

sockets - socket - Protocolo de chat simple



socket ionic 2 (1)

Estoy aprendiendo redes y subprocesos en C #. Para ese propósito estoy desarrollando chat a través de la red.

Actualmente tengo una comunicación básica entre cliente - servidor (TCP). El servidor puede funcionar con múltiples clientes. Pero solo comunicación entre el cliente y el servidor. Básicamente, el cliente envía un mensaje codificado en ASCII al servidor, luego el servidor lo decodifica y muestra en la consola.

Por ahora quiero implementar la comunicación Cliente-Cliente.

Supongamos que tenemos una lista en línea de clientes en cada cliente y un cuadro de mensaje para enviar mensajes a cada cliente.

El siguiente paso es hacer clic en el botón, que compondrá un socket y lo enviará, luego el servidor debería entender a quién se dirige el mensaje.

Entonces, ¿cuál debería ser mi estructura de mensaje, y cómo debería entenderlo en Server, a quién se dirigió el mensaje?

En general, no necesito código, quiero teoría. Simple y corto. Tal vez tutoriales?

He investigado en XMPP. Es muy pesado. Solo necesito una dirección, cómo puedo hacer esto. Mi objetivo es aprender, no implementarlo y olvidarlo.


TCP se basa en secuencias, lo que significa que nunca se sabrá, con la ayuda de TCP, cuándo comienza y finaliza un mensaje. Cualquier diseño de mensaje / protocolo debe abordar eso.

Hay dos formas de detectar cuándo termina un mensaje. La primera forma es agregar un delimitador al final del mensaje, y la segunda forma es incluir la longitud en un encabezado.

HTTP usa ambos. Utiliza una línea vacía para determinar cuándo termina el encabezado. Y en el encabezado obtuvo un encabezado Content-Length que dice qué tan grande es el cuerpo.

Para los protocolos binarios sugiero que use un encabezado de longitud fija donde el primer entero (4 bytes) es una versión y el segundo entero es la longitud del cuerpo. De esta forma, puede cambiar fácilmente el diseño del encabezado entre versiones (ya que la versión es el primer entero).

Para el protocolo de texto, realmente depende de cómo se ve el contenido del mensaje. El problema es que el contenido puede no incluir el delimitador que se utilizará (lo que puede ser difícil si está transportando mensajes de chat). Por supuesto, podría escapar del delimitador si existe en el mensaje de chat real. Pero un enfoque mejor es utilizar un diseño de encabezado / cuerpo como HTTP (ya que también es bastante fácil de analizar y puede tener un número X de encabezados sin tener que cambiar el analizador).

Un mensaje se vería así:

From: Arne To: #ChannelName WrittenAt: 2011-07-03 12:00 GMT Content-Length: 16 This is a text

Tenga en cuenta que la longitud es 16, esto es porque la nueva línea se incluyó en el cuerpo.

En cuanto a la comunicación cliente-cliente, siempre pasaría por el servidor si eres un principiante. Es mucho más fácil, ya que de lo contrario, debe asegurarse de que al menos uno de los clientes no esté detrás de un enrutador (o será imposible entregar el mensaje).

Solo verifique el encabezado To si es para una sala de chat o un usuario.