Quiero implementar un chat simple P2P, ¿alguien me dice por donde podria empezar?
¿Librerias, consejos, documentación, teorias, tutoriales?
Cita de: "KaMuY"Quiero implementar un chat simple P2P, ¿alguien me dice por donde podria empezar?
¿Librerias, consejos, documentación, teorias, tutoriales?
¿Para que SO? ¿Qué lenguaje?
En cualquier caso, con sockets a pelo.
Unix, por ejemplo:
http://www.ecst.csuchico.edu/~beej/guide/i.../ipc/usock.htmlWindows, por ejemplo:
http://burks.bton.ac.uk/burks/pcinfo/progd...ock/winsock.htmUn chat es bastante sencillo.
es para win32 aunque si la libreria es multiplataforma mejor :P
¿Sockets a pelo?
Se un chat es bastante simple pero la idea es aprender conceptos y tal... para saber programar estructuras P2P y como trabajarlas.
Me gustaria algo mas del razonamiento que te hace decidirte por una elecion o otra :P
Muchas gracias por tu respuesta :)
Lo sockets son dependientes del sistema operativo. Son unas pocas llamadas que permiten por ejemplo: escuchar por un puerto (para que te conecten), abrir conexión hacia un puerto de otro ordena, enviar datos, etc.
Para win32
WinsockCon sockets a pelo me refiero a que son de bajo nivel, la estructura te la tienes que montar tú.
También puedes probar con algo como: (yo no lo he tocado)
http://www.alhem.net/Sockets/index_spanish.html , que tiene ejemplos de chats:
http://www.alhem.net/project/example3/index.htmlhttp://www.alhem.net/project/example7/index.htmlSobre la arquitectura P2P en vez de Cliente/Servidor, tendrás que pensar cómo hacerlo (por ejemplo un servidor apunta direcciones de usuarios, un servidor apunta direcciones de otros servidores, cada cliente se guarda su contactos e intenta lanzarse con ellos al chat (por ip),...).
Puedes fijarte en sitios como:
http://java.sun.com/developer/technicalArt...orking/jxta2.0/ Diagrama del chat P2PSi conoces java JXTA:
http://www.jxta.org/Son sólo indicaciones, nunca he hecho ningún chat p2p :)
Hola Warchief, la idea es esta que tu comentas. el problema es que no consigo hacer funcionar la libreria JXTA, además he visto que existe una implementación de la libreria en C.
Has echo algo con JXTA, sabes como puedo iniciarme?
Una de mis dudas es saber si sale a cuenta aprender como va JXTA o hacer la estructura de Red a pelo con sockets... :P
__________________________________________________________
Puedes fijarte en sitios como:
http://java.sun.com/developer/technicalArt...orking/jxta2.0/ Diagrama del chat P2P
Si conoces java JXTA:
http://www.jxta.org/__________________________________________________________
Hombre, si lo que dominas es java yo me iría a jxta, porque parece una abastracción de los sockets (recuerda que los sockets no son más que un puñado de funciones como las de ficheros (open/close/read/write y algunas más de control select/bind/etc). En jxta no he hecho nada; lo único parecido que he hecho en java ha sido con
JMF (Java Media Framework, que está bien si quieres añadir voz al chat XD).
De la implementación a C ni idea, he visto el port a C#, pero nada más.
También puedes echar un vistazo a otras libs como
RakNet o
Hawk NL (no, no he probado ninguna).
Si el objetivo es aprender y lo que conoces es C:
Como un chat no es demasiado complicado, como primera aplicación se puede hacer con sockets. Una vez que estés conforme con la programación de red, se puede pensar en un objetivo mayor o incluso volver a hacer el chat usando una de las librerías.
Si vuelves a considerar sockets:
Guía estupenda (pero de Unix):
http://www.arrakis.es/~dmrq/beej/index.htmlArtículos Winsock en Gamedev:
http://www.gamedev.net/reference/list.asp?...tegoryid=30#298Si conoces java, JXTA. Si conoces C, sockets. Si quieres aprender librería concreta, la librería.
¿Por qué no puedes hacer correr JXTA?
A ver, domino C, java etc etc.. soy Eng. informatico Superior.
Esta noche intentare probar con JXTA algo.. el problema es que me petaba las librerias.
ya dire algo
Cita de: "KaMuY"Esta noche intentare probar con JXTA algo.. el problema es que me petaba las librerias.
:huh: Cuenta pues qué error da, etc, a ver si lo sacamos.
Creo que lo are todo con sockets a pelo :P
Ahora me surge una duda, como hacen programas ¿como el kazaa para que no sea necesario abrir puertos y los peers se comuniquen?
Tenia entendido que normalmente en una P2P cada peer era servidor y cliente a la vez, por lo tanto en algún momento tendría que estar escuchando una conexión entrante, ¿no?
O trabajan con UDP... o ¿como lo hacen?
¿Alguien lo sabe?
Usan UDP, más que nada porque es algo más eficiente y como se verifican los chunks y se pueden pedir trozos concretos. Para atravesar NAT lo más normal es usar
STUN (
aqui hay un algoritmo algo más simple). Esto se salta un NAT sin muchos problemas, ahora... firewalls y proxys hay que hacer cosas mas sofisticadas.
a ver si lo entendí bien:
La idea es que cada peer comience una conexión UDP por un puerto determinado. Entonces cada peer tendrá abierto un puerto por el que podrá recibir paquetes UDP. Entonces solo queda intercambiar paquetes entre los peers a los puertos que hemos abierto en cada maquina al iniciar una conexión..
¿Es esto? :S
Otra alternativa(bueno, al menos una manera de "abrir los puertos" del usuario) es
UPnP (Wikipedia.org), que también tiene sus propios problemas. El cliente de bittorrent Azureus lo implementa, aunque depende del router si viene activado por defecto o no.
Cita de: "KaMuY"La idea es que cada peer comience una conexión UDP por un puerto determinado.
La idea es que conectas con un servidor, que intercambia los puertos que el router ha asignado a la conexion, y utilizas estos puertos abiertos para conectar con el otro. Con routers hardware suele funcionar... aunque si tu programa tiene mucho exito el servidor puede soportar bastantes conexiones.
accept te da un nuevo puerto automáticamente.
Me explico:
1) Servidor: Se hace bind del puerto X, esto pone el puerto X a escuchar
2) Cliente: Se hace opensocket que te da un puerto libre Z (no importa cuál)
3) Cliente: Hace connect al puerto X del Servidor (debe conocer su ip y puerto)
4) Servidor: accept escucha la petición del cliente y crea un puerto nuevo Y (libre, no importa cuál)
5) Los sockets Z e Y quedan emparejados. Lo que el cliente envía por Z lo recibe el servidor por Y
(X sigue escuchando)
Por tanto sí, tienes que poner a escuchar un puerto X.
La obtención de la ip y puerto del servidor es otra historia. En GNUtella se hace con caché. En Emule/Edonkey con los servidores ed2k, el nodes.dat (o algo así) de contactos para Kademlia y la transmisión de nuevas fuentes al conectar a otro.
En emule hay opciones para desactivar UDP, que es lo que usa Kademlia. Creo que ed2k usa TCP.
por casualidad he llegado a este foro que por lo que veo hay mucho nivel...jeje, yo soy totalmente aficionado y por motivos personales he realizado una pagina web, www.renegimenez.com y la verdad que no tengo ni idea de programacion ni de na de eso, pero me seria interesante poner dos salas de chat, una para los amigos y otra para hablar de deporte, he realizado varias pruebas y no me termina de convencer, y no sé, se me ha ocurrido "pedir ayuda" por aqui a ver si alguien me podia configurar uno para meterlo en la pagina o asesorarme de donde puedo cogerlo para que funcione siempre bien...muchas gracias y espero alguna respuesta