PDA

Ver la Versión Completa : Conexión Cliente-Server-Cliente


MorSerNa
30/04/15, 00:51:40
Buuuuenas. Como ya sabreis estoy con los sockets blablabla.....

Budnl , he conseguido enviar una imagen desde un cliente a un server por socket y al recibirla hacerle unas cosillas.

Lo que quiero es que esa imagen la envíe desde ese mismo server a OTRO cliente diferente. ¿Se puede?

Gracias [emoji48] [emoji48] [emoji48]

kriogeN
30/04/15, 01:42:08
Como poderse se puede, siempre y cuando el cliente esté conectado al Server en ese momento.

MorSerNa
30/04/15, 07:50:16
Ajam, pero si tengo por ejemplo 7 clientes conectados, como específico a cual enviárselo?

mocelet
30/04/15, 10:18:02
Si tuvieras 7 clientes conectados tendrías 7 objetos Socket, uno por cada conexión abierta. La forma de distinguirlos si no tienes más información es por la dirección IP del cliente, que la puedes saber con el método getRemoteSocketAddress() de cada socket.

Probablemente lo que quieres hacer es más complicado y requiera al menos de un intercambio de información inicial entre el cliente y el servidor para que el cliente se identifique con un nombre de usuario o identificador único, así ya no tienes que andar sabiendo IPs.

kriogeN
30/04/15, 11:36:43
Para casos como este, y más aún siendo conexiones con móviles, lo mejor es usar WebSocket. No tendrás problemas de puertos y sus funciones basadas en eventos se acondicionan mejor a Java.

mocelet
30/04/15, 12:06:57
Los websockets se crearon para los navegadores que no tenían una forma de comunicarse de forma bidireccional por cómo fue concebido HTTP en su momento. De hecho, al final es un "apaño" de la conexión HTTP (que no deja de ser un socket TCP) para acordar reutilizar la conexión TCP y utilizarla para envío y recepción de mensajes de texto o binarios.

Problemas de puertos va haber igualmente porque es una conexión TCP, e incluso problemas de proxys HTTP que por lo que sea no sean compatibles con websockets y no hagan el "upgrade".

Las bibliotecas como AndroidAsync (¿alguna otra recomendada para WS kriogeN?) ofrecen una interfaz con listeners muy sencillos (mensaje de texto recibido, mensaje binario recibido), pero también hace falta un servidor compatible con websockets (yo uso Netty 4.0, pero para enviar un fichero es matar moscas a cañonazos, con node.js seguro que se tarda menos y el código es más legible).

kriogeN
30/04/15, 12:33:09
Para Android uso Autobahn:

http://autobahn.ws/android/

Como los servidores que programo son todos ASP.NET tienen soporte nativo de WebSocket.

Mi experiencia es que los WebSocket funcionan mucho mejor a través de Proxys al ir encapsulado sobre HTTP, además de que me parecen bastante más sencillos de programar que los Sockets tradicionales. Tanto a nivel de cliente como de servidor.

MorSerNa
30/04/15, 13:46:06
Entonces que hago? XDD

mocelet
30/04/15, 14:13:27
De momento leer mucho sobre cómo hacer aplicaciones con conectividad de red en Android y tal vez de HTTP y de websockets para que valores qué te resulta más cómodo.

Según tus requisitos puede haber más trabajo en la parte de servidor que en la de cliente. Y no tienes por qué hacer en Java el servidor, puede ser PHP, node.js, etc...

Enviar o recibir ficheros se puede hacer con un servidor web normal y corriente también, la dificultad viene si quieres que al subir un fichero avise a alguien para que se lo baje. Si está conectado por socket o websocket es cuestión de enviarle por ese canal bien el fichero o una URL para que se lo descargue. Si no está conectado, o bien el cliente pregunta al servidor periódicamente si hay ficheros nuevos o bien usa el Google Cloud Messaging (GCM) para ser notificado.

Distintos métodos, cada uno con sus pros y sus contras.

MorSerNa
30/04/15, 14:50:01
Lo que tengo pensado es hacer un ping al Pc del cliente y si esta conectado enviarle la foto y sino por correo electrónico

MorSerNa
30/04/15, 17:33:30
Si tuvieras 7 clientes conectados tendrías 7 objetos Socket, uno por cada conexión abierta. La forma de distinguirlos si no tienes más información es por la dirección IP del cliente, que la puedes saber con el método getRemoteSocketAddress() de cada socket.

Probablemente lo que quieres hacer es más complicado y requiera al menos de un intercambio de información inicial entre el cliente y el servidor para que el cliente se identifique con un nombre de usuario o identificador único, así ya no tienes que andar sabiendo IPs.
Como que 7 objetos Socket?