PDA

Ver la Versión Completa : Haciendo un sistema de comunicación por sockets sencillito


kakarotv5
03-10-2007, 00:30:03
He seguido este sencillo tutorial (http://www.hackerdude.com/courses/delphi/Cap010.2.html) para hacer un cliente servidor, lo he probado bajo locahost y funciona pero me gustaría saber que he de hacer para que funcione entre dos ordenadores que sólo están conectados a través de Internet.

Adjunto el código fuente que he creado yo con la ayuda del tutorial.

Para que funcione primero ejecutad el servidor y luego el cliente. En el cliente según está poneis localhost en el Edit que está a la derecha del Label "Computadora" y escribíd lo que querais en el Memo de arriba del cliente como si fuera un chat.

Saludos.

poliburro
03-10-2007, 03:01:37
no necesitas nada adicional si estás directamente conectado a internet.

en el campo de host, pornes tu ip de internet y listo :)

kakarotv5
03-10-2007, 13:27:22
no necesitas nada adicional si estás directamente conectado a internet.

en el campo de host, pornes tu ip de internet y listo :)

Ahora en vez de localhost he puesto mi IP privada y también funciona :). Pero si pongo mi IP pública no obtego ningún resultado. Para establecer la comunicación con dos ordenadores que sólo están conectados a través de Internet qué IP debo poner la pública o la privada y qué puerto he de usar.

EDITO: Ahora me ha ocurrido algo muy curioso, he abierto el puerto 9923 (que es el puerto que usa mi programilla por defecto) y al intentar conectarme poniendo mi IP pública me sale el siguiente mensaje de error:

Project Project1.exe raised exception class ESocketError with message 'Asynchronous socket error 10053'. Process stopped. Use Step or Run to continue.'

Es curioso porque si no abro el puerto 9923 no sale ningún mensaje de error (aunque tampoco conecta).

Ayudadme por favor que parece que voy por buen camino, muchas gracias y un saludo.

duilioisola
03-10-2007, 15:03:58
PC1 IP:80.1.2.3
PC2 IP: 213.1.2.3

La PC1 llama a la PC2 por el puerto 9923. Lo que quiere decir que la PC2 debe tener el puerto 9923 abierto y un programa esperando comunicación.

PC1 IP:80.1.2.3 Port: 1000 (para salir elige un puerto al azar)
PC2 IP:213.1.2.3 Port 9923 esperando

PC1 IP:80.1.2.3 Port: 1000 -----> Port 9923 de PC2 IP:213.1.2.3

A menos que haya un Firewall que no deje salir paquetes (problema para PC1) o un Firewall que no deje recibir paquete por ciertos puertos (problema para PC2) no debería haber problemas.

También hay que decirle al router de PC2 (si no está en monopuesto) que todo lo que llegue para el puerto 9923 lo envía a la direccion interna de PC2 (normalmente 192.168.xxx.yyy o 172.26.xxx.yyy)

duilioisola
03-10-2007, 15:06:59
Esto es sobre el error 10053

Software caused connection abort.
An established connection was aborted by the software in your host computer, possibly due to a data transmission time-out or protocol error.

O el servidor (o un firewall) abortó la conección, o hubo un time-out.

kakarotv5
03-10-2007, 15:29:21
A menos que haya un Firewall que no deje salir paquetes (problema para PC1) o un Firewall que no deje recibir paquete por ciertos puertos (problema para PC2) no debería haber problemas.

A parte de esto que dices supongo que habrá que habrá que abrir el puerto 1000 en el PC1 y el puerto 9923 en el PC2. ¿Me equivoco?

También hay que decirle al router de PC2 (si no está en monopuesto) que todo lo que llegue para el puerto 9923 lo envía a la direccion interna de PC2 (normalmente 192.168.xxx.yyy o 172.26.xxx.yyy)

Esto no lo entiendo bien. ¿Se hace gestionando el router desde el navegador?

Gracias y un saludo.

duilioisola
03-10-2007, 15:43:08
En el PC1 no es necesario abrir el puerto 1000. Normalmente los Firewalls y los routers dejan salir por cualquier puerto, pero solo entrar por algunos (80 http, 21 ftp, etc.)

La segunda parte es los que se llama NAT.
- Supongamos tu router tiene la IP pública 80.1.2.3.
- Supongamos que tu pc tiene la IP privada 192.168.1.2.

Pues: debes entrar al router, ir a la parte de NAT y decirle:
Todo lo que entre desde el PUERTO 9923 hasta el PUERTO 9923 se lo mandas a la IP 192.168.1.2.

Nota: si está en monopuesto, todo esto no vale. Funciona como si guera un modem y todo lo que entra al router entra directamente a tu PC.

kakarotv5
03-10-2007, 16:01:34
En el PC1 no es necesario abrir el puerto 1000. Normalmente los Firewalls y los routers dejan salir por cualquier puerto, pero solo entrar por algunos (80 http, 21 ftp, etc.)

¿En vez del puerto 1000 puedo usar el 9923?

Mi idea es usar el mismo puerto tanto para el cliente como para el servidor.

Pues: debes entrar al router, ir a la parte de NAT y decirle:
Todo lo que entre desde el PUERTO 9923 hasta el PUERTO 9923 se lo mandas a la IP 192.168.1.2.

Tengo esto http://img518.imageshack.us/img518/6498/puertosbi9.jpg

duilioisola
03-10-2007, 16:38:02
Del puerto por el que sale se encarta el sistema operativo. Lo que hace es ver el primero que tiene libre y usarlo.

Si quieres probarlo has lo siguiente:
- te conectas a una página (www.google.es por ejemplo)
sin cerrar el navegador haces lo siguiente en una consola (inicio-->ejecutar-->cmd) y escribes netstat o netstat -n.
En la columna de Direccion Local verás tu IP y por qué puerto está saliendo.
En la columna de Direccion Remota verás la dirección IP a la que estás conectado y el puerto.


C:\>netstat -n

Conexiones activas

Proto Dirección local Dirección remota Estado
TCP 127.0.0.1:4378 127.0.0.1:4379 ESTABLISHED
TCP 127.0.0.1:4379 127.0.0.1:4378 ESTABLISHED
TCP 127.0.0.1:4380 127.0.0.1:4381 ESTABLISHED
TCP 127.0.0.1:4381 127.0.0.1:4380 ESTABLISHED
TCP 127.0.0.1:4386 127.0.0.1:4387 ESTABLISHED
TCP 127.0.0.1:4387 127.0.0.1:4386 ESTABLISHED
TCP 127.0.0.1:4394 127.0.0.1:4395 ESTABLISHED
TCP 127.0.0.1:4395 127.0.0.1:4394 ESTABLISHED
TCP 127.0.0.1:9999 127.0.0.1:2509 TIME_WAIT
TCP 192.168.152.200:1797 209.85.137.18:80 ESTABLISHED
TCP 192.168.152.200:1964 192.168.152.252:445 ESTABLISHED
TCP 192.168.152.200:1966 192.168.152.252:3050 ESTABLISHED
TCP 192.168.152.200:2511 66.249.91.83:80 ESTABLISHED
TCP 192.168.152.200:4130 192.168.152.252:445 ESTABLISHED
TCP 192.168.152.200:4443 66.249.91.19:80 ESTABLISHED
TCP 192.168.152.200:4810 64.233.183.147:80 CLOSE_WAIT



C:\Documents and Settings\Duilio>netstat

Conexiones activas

Proto Dirección local Dirección remota Estado
TCP PC-Duilio:4378 localhost:4379 ESTABLISHED
TCP PC-Duilio:4379 localhost:4378 ESTABLISHED
TCP PC-Duilio:4380 localhost:4381 ESTABLISHED
TCP PC-Duilio:4381 localhost:4380 ESTABLISHED
TCP PC-Duilio:4386 localhost:4387 ESTABLISHED
TCP PC-Duilio:4387 localhost:4386 ESTABLISHED
TCP PC-Duilio:4394 localhost:4395 ESTABLISHED
TCP PC-Duilio:4395 localhost:4394 ESTABLISHED
TCP PC-Duilio:1797 mg-in-f18.google.com:http ESTABLISHED
TCP PC-Duilio:1964 192.168.152.252:microsoft-ds ESTABLISHED
TCP PC-Duilio:1966 192.168.152.252:3050 ESTABLISHED
TCP PC-Duilio:2511 ik-in-f83.google.com:http ESTABLISHED
TCP PC-Duilio:4130 192.168.152.252:microsoft-ds ESTABLISHED
TCP PC-Duilio:4443 ik-in-f19.google.com:http ESTABLISHED
TCP PC-Duilio:4810 nf-in-f147.google.com:http CLOSE_WAIT


Nota: netstat -n no traduce las direcciones. te muestea los numeros IP y los numeros de puerto.
- http = 80
- ftp = 21
- mg-in-f18.google.com = 209.85.137.18

duilioisola
03-10-2007, 16:45:27
Creo que puede andar por ahí, pero no es NAT.

Creo que eso es para que de una dirección y un puerto dado se conecten a una dirección y un puerto especícico.

De todas formas debería funcionar si lo configuras bien.

El NAT es solo enviar lo que entre por un puerto enviarlo a una dirección especificada (por ese mismo puerto)

Para que leas un poco más sobre el tema:
http://www.monografias.com/trabajos20/traductor-nat/traductor-nat.shtml

Kipow
03-10-2007, 19:38:00
Precisamente lo que necesitas hacer es que todas las peticiones al puerto de tu aplicacion sean direccionadas a la ip local (donde se ejecuta el server). eso lo debes de hacer directamente en tu router. aca puedes darte una idea de como hacerlo www.portforward.com (http://www.portforward.com)

Slds

kakarotv5
03-10-2007, 21:57:20
Al final lo he conseguido.

He conseguido establecer una comunicación entre dos ordenadores que sólo están conectados a través de Internet, únicamente he hecho lo siguiente:

En el ordenador PC1 se ejecuta el servidor, que lo único que hace es escuchar por el puerto 9923. He abierto el puerto 9923 en el router de este PC.

Luego en el ordenador PC2 se ejecuta el cliente, se pone la IP pública o real del PC2 en el Edit que está a la derecha del Label "Computadora" y luego se escribe lo que se quiera en el Memo de arriba como si fuera un chat. También he abierto el puerto 9923 en el router de este PC.

El servidor recibirá las cadenas de texto inmediatamente.

De esta forma la comunicación es unilateral, por lo que además he ejecutado en el PC1 el cliente y en el PC2 el servidor y he realizado la misma operación, con lo que se consigue una comunicación bilateral estilo chat.

Me doy por satisfecho, sólo tengo que mejorar un poco el programa y seguir trasteando para conseguir mis propósitos.

Al final no he tenido que configurar los routers de modo que todo lo que les llegue por el puerto 9923 lo envíen a la direccion interna de los PC´s.

Supongo que será porque están en monopuesto.

Muchas gracias y un saludo.

duilioisola
04-10-2007, 08:55:35
Felicitaciones!

Cuando tengas una aplicación interesante pasate por el club y muéstranosla.

También podrías hacer un pequeño ejemplo de un "micro-mini-chat" y ponerlo en la parte de trucos, por si alquien quiere aprender a hacerlo.

kakarotv5
20-11-2007, 02:44:33
¿Dónde podría encontrar adicinal sobre sockets para Delphi?

Busco en el Wiki (http://wiki.clubdelphi.com/wiki/index.php/Portada) de esta página pero nunca encuentro nada.

Saludos.

Caral
20-11-2007, 02:58:32
Hola
Aqui hay un ejemplo sencillo de un chat, no me acuerdo si lo saque de los ejemplos del delphi o de donde lo saque, pero funciona.
Saludos

kakarotv5
20-11-2007, 14:24:50
Gracias, le echaré un vistazo.

Por cierto Caral, hace unos días me lei un tutorial que dejaste en el Wiki (http://wiki.clubdelphi.com/wiki/index.php/Portada), se llama Conectar Access Ado (http://wiki.clubdelphi.com/wiki/index.php/Tutorial_Conectar_a_Access_con_ADO_%28Ejemplo_Visual%2C_Wink%29), es un gran tutorial y me ayudó mucho. Sigue así.

Saludos.