Cita:
Iniciado por yashauo El chat debe enviar archivos. para ello, he pensado que debe crear un hilo adicional para que no quede ocupado el que envia los mensajes y pueda seguir enviandolos.
¿Hay alguna forma de que los archivos no tengan que pasar por el servidor sin tener que abrir algun puerto en el cliente?
si creo un hilo server en un cliente para que reciba el archivo exclusivamente necesito abrir el puerto que va a usar ¿no?
Depende, ¿el chat es público?, si el chat es público estás exponiendo la IP de todos los usuarios a todos los demás usuarios que acepten enviar archivos. Lo cual puede ser o no problema, porque lo mismo sucede con las redes P2P, el hecho es que un usuario mal intencionado puede causar molestias a los demás. Pero si lo deseas busca información sobre DCC en IRC.
Lo que hacen los servidores de mensajería es usar varios (muchos) servidores secundarios donde se abre una segunda conexión del cliente y es por esta donde se envían los archivos, lógicamente es lo mas lento y tedioso que existe, dependiendo del ancho de banda y la cantidad de usuarios.
Otra opción es usar un protocolo inventado donde dividas los 'paquetes' que envías en 'datos' y 'mensaje', de alguna forma divides la información en un solo 'flujo' y la separas al llegar al destino; lo cual es muy complicado de implementar.
Y por último, sino usa un hilo que envíe la información a un cliente que abrió un socket de tipo servidor, y efectivamente solamente usas un puerto.
Cita:
Iniciado por yashauo JTextField campo; ---------------------------> en la vista , tiene un evento cuando pulsa enter que tiene que utilizar el metodo del modelo enviarMEnsaje.
enviarMensaje(String Mensaje); --------> en el Modelo, es el que envia el mensaje al servidor.
...
Pero segun he estado leyendo por ahi. todo el mundo dice que deberia implementar una interfaz que haria de "modelo observador" entre la vista y el modelo para captar los cambios.
¿Whut?
Primero que todo 'enviarMensaje' va en el controlador, es este el encargado de seleccionar el método y la forma de envío, pudiendo seleccionar entre varios o diferentes métodos dependiendo de la implementación final, por el principio de desacoplamiento. (Mas adelante pudes crear otro método de envío y solamente reemplazas el modelo).
Segundo, el que manda el mensaje es un modelo, no una interfaz intermedia entre nada, es un modelo porque estás usando 'datos' modelando información, que está venga de un socket a través de la red no tiene nada que ver, y por el mismo principio de desacoplamiento debe ser un modelo.
Al final cuando presionas el botón, este llama al método 'enviarMensaje' en el controlador y es este último el que decide como lo manda, por mail, por socket, por osmosis, por saltos o lo que le venga en gana en ese momento, seleccionando un modelo de datos para realizar esa actividad.
El modelo debe generar eventos, 'actualizarBytesRecibidos', 'finalizadaLaTransferencia', etc. Estos eventos los recibe cualquiera que esté escuchando (addXXXListener), es decir, pueden haber dos o mas vistas observando dichos eventos u otros modelos, todo a través de interfaces.
Para implementar eso busca información sobre la clase 'EventListenerList' y su uso. El controlador, la vista, y el modelo pueden generar eventos y escuchar los eventos que sean convenientes.
Saludos,