tutorial socket servidor datos crear con cliente java udp netty

servidor - socket tcp java



Netty-servidor UDP (3)

Como probablemente sepa, UDP es un transporte sin conexión. Un solo canal puede recibir datos y escribir datos en cualquier dirección de destino. Por lo tanto, un canal UDP no tiene una dirección remota asociada en la forma en que lo hace un canal TCP. Si bien creo que es posible hacer que Netty asocie un canal UDP con una dirección remota específica, no tengo los detalles a mano y, para ser honesto, creo que obtener la dirección del evento del mensaje es la mejor opción.

Esto lleva a su segunda pregunta porque sí, tendrá que mantener la dirección remota en alguna parte. No he hecho ninguna programación UDP en Netty, así que no estoy seguro de si necesita asignar la dirección remota a un objeto de canal, o si Netty siempre está devolviendo el mismo objeto de canal independientemente. Vale la pena verificar esto, ya que es posible que solo necesite mantener una sola referencia al canal.

Estoy teniendo un servidor basado en UDP Netty. Tiene un SimpleChannelUpstreamHandler canalizado donde messageReceived método messageReceived .

Necesito volver a escribir algo de vez en cuando. Solo podría hacerlo utilizando la información de socket de MessageEvent.getRemoteAddress() y el canal de MessageEvent.getChannel() . Para poder reutilizar esta información, me mantengo en un mapa estático.

Esto se convierte en MessageEvent.getChannel().write("foo", MessageEvent.getRemoteAddress());

Lo que esperaba era tener el trabajo MessageEvent.getChannel().getRemoteAddress() , que no es el caso. Siempre me da null .

  1. Estoy haciendo algo mal ?
  2. ¿Hay alguna forma mejor de escribir que mantener el canal y la dirección remota en algún miembro?

1) Eche un vistazo a este controlador upstream UDP . Para obtener la dirección remota del remitente, puede usar el siguiente código SocketAddress remoteAddress = datagramPacket.sender();
2) Lo que @johnstlr mencionó es correcto, no es correcto asociar un canal UDP con una sola dirección remota. Pero puede usar un hashmap simultáneo para realizar búsquedas como se muestra en el archivo anterior. Este servidor de juegos en realidad usa sesiones que tienen conexiones TCP y UDP. Esto hace que sea fácil enviar datos confiables sobre TCP y todos los datos de marco sobre UDP.


cuando utiliza un canal UDP (Datagram) como un canal de servidor, solo lo vincula a una dirección local y no se establece ninguna conexión. esta es la razón por la cual no hay una dirección remota asociada con el canal y siempre obtienes null cuando llamas a MessageEvent.getChannel().getRemoteAddress() . este comportamiento es esperado y correcto. el mismo canal de "servidor" UDP único maneja todas las solicitudes de clientes entrantes.

cuando se usa un canal UDP como un canal cliente, se puede crear una "conexión" conectando el canal a una dirección remota. en este caso, el canal tendrá una dirección remota configurada (aunque no se realiza una conexión real) y la invocación de MessageEvent.getChannel().getRemoteAddress() devolverá la dirección remota configurada. la conexión de un canal UDP evita que el usuario use el canal para enviar datos a las direcciones remotas distintas a la configurada en el canal. intentar hacerlo arrojará una excepción. conectar un canal de cliente es opcional en UDP, un cliente puede operar correctamente con un canal que solo está enlazado en una dirección local, siempre que guarde la dirección remota.

Creo que tienes dos opciones:

  1. guardando las direcciones remotas de los clientes con el identificador del cliente y usando el canal "servidor" para enviar los datos. guardar el canal no funcionará porque el mismo canal se usará para comunicarse con todos los clientes.
  2. creando un nuevo canal conectado para cada cliente y guardando los nuevos canales con los identificadores del cliente.

Creo que la primera opción es mejor.