Soy completamente nuevo en la creación de una conexión de red en Java, así que me disculpo si esta es una pregunta estúpida.

Estoy tratando de crear un compañero de D&D en Java que permitirá a un jugador crear su personaje y luego enviarlo al DM para que puedan verlo, hacer cambios y enviarlo de vuelta al jugador. Quiero poder hacerlo de modo que cada vez que se cambie un campo en una computadora, también se cambie en la otra computadora.

Después de un montón de investigación en línea, he podido crear una conexión de socket entre el DM (servidor) y el reproductor (cliente) y pasar un mensaje entre los dos, pero no estoy seguro de cómo funciona una conexión de socket después de que se realiza esta conexión inicial . Mi investigación no ha sido muy clara al respecto. He encontrado muchos recursos que han dicho que Java cierra el socket después de que se ha pasado un mensaje y muchos que dicen que el socket permanece abierto.

Si java cierra el socket, entonces mi problema es bastante fácil de resolver porque entonces tendré que abrir un nuevo socket cada vez que necesite pasar datos, asegurándome de pasar la dirección IP del cliente al servidor la primera vez que hago una conexión.

Mis verdaderas preguntas surgen cuando un enchufe permanece abierto.

Si el socket permanece abierto y varios clientes se conectan al servidor, ¿el servidor simplemente gritará por la red cada vez que transmita un mensaje para que todos los clientes reciban el mensaje? (Si este es el caso, sé que puedo simplemente adjuntar un nombre de usuario al frente del mensaje para que el cliente pueda determinar si el servidor está hablando con él).

Si el servidor no grita, ¿cómo especifico con qué cliente quiero que hable el servidor?

¿Tendré que agregar un bucle a mis métodos de recepción para que el cliente / servidor esté constantemente escuchando una transmisión desde el servidor / cliente o Java lo hará automáticamente después de ejecutar el método la primera vez?

-2
Richard Crandall 13 nov. 2017 a las 04:26

2 respuestas

La mejor respuesta

He encontrado muchos recursos que han dicho que java cierra el socket después de que se ha pasado un mensaje

Las encontraste donde?

y muchos que dicen que el enchufe permanece abierto.

Todos esos son correctos. Java nunca cierra las conexiones. La aplicación cierra conexiones.

Si java cierra el socket, entonces mi problema es bastante fácil de resolver porque entonces tendré que abrir un nuevo socket cada vez que necesite pasar datos, asegurándome de pasar la dirección IP del cliente al servidor la primera vez que hago una conexión.

No lo hace.

Mis verdaderas preguntas surgen cuando un enchufe permanece abierto.

Si el socket permanece abierto y varios clientes se conectan al servidor, ¿el servidor simplemente gritará por la red cada vez que transmita un mensaje para que todos los clientes reciban el mensaje?

No. Responderá a través del socket que está conectado al cliente correspondiente.

(Si este es el caso, sé que puedo simplemente adjuntar un nombre de usuario al frente del mensaje para que el cliente pueda determinar si el servidor está hablando con él).

Innecesaria.

Si el servidor no grita, ¿cómo especifico con qué cliente quiero que hable el servidor?

El servidor responde a través del mismo socket desde el que leyó la solicitud.

¿Tendré que agregar un bucle a mis métodos de recepción para que el cliente / servidor esté constantemente escuchando una transmisión del servidor / cliente?

No, tendrá que agregar un hilo por socket aceptado, que repite las solicitudes de lectura hasta el final de la transmisión.

¿O lo hará Java automáticamente después de ejecutar el método la primera vez?

No.

Parece que has estado leyendo algunas tonterías realmente espantosas. Eche un vistazo a la sección Redes personalizadas del Tutorial de Java.

1
Marquis of Lorne 13 nov. 2017 a las 09:21

Además de la sabia respuesta de EJP, podría valer la pena aclarar:

  1. Parece que (sabiamente) usa TCP, por lo que su Socket representa una conexión entre 1 servidor y 1 cliente. No gritar". En ejemplos como este, cuando se establece la conexión (es decir, el cliente obtiene una Socket llamando a "nuevo Socket" y el servidor obtiene un Socket llamando a "aceptar"), esos Sockets están dedicados a esos 2 puntos finales específicos. Entonces, si 10 clientes se conectan a 1 servidor, el servidor mantendrá 10 Sockets y no los mezclará. Un poco como una pobre secretaria que tiene 10 teléfonos en su escritorio y los contesta todos; a pesar del desorden, cada auricular está claramente conectado a 1 cliente.
  2. La conexión puede durar un tiempo y servir varios mensajes. Terminará cuando cualquiera de los lados llame a 'socket.close', o puede ser terminado por terceros subyacentes (sistema operativo, proxies, firewalls). Para su primera versión, o para requisitos comerciales simples, probablemente sea suficiente conversar a través de esta conexión simple. Sin embargo, para los datos comerciales críticos que requieren "garantía de entrega", es posible que deba invertir un poco de pensamiento y posiblemente herramientas como RabbitMQ.

Buena suerte:)

0
Pelit Mamani 13 nov. 2017 a las 02:56