Manejo de múltiples hilos con TCP

Estoy tratando de implementar una aplicación de chat y tengo que elegir el diseño sobre el uso de TCP o UDP para el intercambio de mensajes entre pares. Quiero usar TCP pero tengo el siguiente problema.

Situación del problema: el par A está escuchando en un puerto conocido (por ejemplo, 5555). Cuando el par B quiere enviar un mensaje al par A, se conecta al puerto 5555 en A. El par A acepta la conexión e inicia un nuevo hilo para tratar la comunicación con el par B, de modo que otros pares (por ejemplo, el par C) puedan conéctese al puerto 5555 del compañero A. Ahora, el problema es que no es un protocolo de solicitud/respuesta, por lo que me confunde que si el par A no responde al par B por algún motivo, los mensajes subsiguientes enviados por B se entregarán al puerto 5555 en el par A. y el par A creará hilos separados para cada uno de los mensajes recibidos?

El uso de UDP probablemente resolverá este problema y no tendré que crear subprocesos separados para comunicarme con cada par y todos pueden enviar los mensajes al mismo puerto conocido. Pero quiero usar TCP para garantizar que los mensajes se entregarán. ¿Alguna idea de cuál sería una buena manera de manejar este problema y usar solo un hilo para comunicarse con un compañero?

preguntado el 27 de julio de 12 a las 17:07

2 Respuestas

El problema que describe no ocurrirá porque TCP es un protocolo 'conectado', lo que básicamente significa que los dos pares tienen que negociar la comunicación antes de que suceda cualquier otra cosa. Después de eso, TCP controla el orden de los paquetes de datos para asegurarse de que lleguen a destino y en el orden correcto. Por cierto, TCP significa Protocolo de control de transmisión, por lo que pone mucho énfasis en asegurarse de que lo que describiste no suceda. No es en absoluto el caso con UDP.

Una vez que tu ServerSocket ha aceptado la conexión del cliente Socket, la negociación ha finalizado y el flujo TCP está dedicado a esa comunicación.

La única forma en que se crea uno nuevo es si su cliente emite otra conexión a través de un nuevo Socket.

Pero la mejor manera de convencerse a sí mismo es agregar el registro a su aplicación y probarlo usted mismo.

Respondido 27 Jul 12, 17:07

+1. además, el serverSocket solo debe escuchar las conexiones entrantes en un puerto predefinido; toda la comunicación adicional entre pares se realizará en puertos aleatorios (pero preestablecidos). - tiburón

@Shark No. En el lado del servidor, el socket aceptado usa el mismo puerto local que el socket de escucha. Tampoco se requiere arreglo previo. La parte sobre lo que debe hacer el ServerSocket ni siquiera tiene sentido, ya que ciertamente no puede hacer nada más. - user207421

Usted está confundiendo escucha, o servidor, sockets y conectado enchufes

Una vez que se acepta la conexión TCP en el lado de escucha, tiene un nuevo socket de dúplex completo entre dos partes, para que puedan intercambiar datos. El único propósito de un socket de escucha es aceptar conexiones, no fluyen datos de aplicaciones a través de ellos.

Puede transferir ese nuevo socket conectado a un subproceso, pero ciertamente no tiene que hacerlo: puede manejar muchos sockets sin bloqueo en un solo subproceso, creo que el paquete Java NIO se creó exactamente para esto.

Respondido 27 Jul 12, 17:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.