Foros del Web » Programando para Internet » Python »

Conección por socket en phython

Estas en el tema de Conección por socket en phython en el foro de Python en Foros del Web. Resulta que estoy haciendo una conección por socket para recibir el dato de un sistema externo, mirando el libro de python para todos: yo quiero ...
  #1 (permalink)  
Antiguo 26/05/2011, 12:28
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Conección por socket en phython

Resulta que estoy haciendo una conección por socket para recibir el dato de un sistema externo, mirando el libro de python para todos:

yo quiero que el dato entre y se muestre, nada mas.

Pero me sale un error al procesarlo en la linea de comandos:

Código:
# ./dato.py
No protocol specified
import: unable to open X server `:0' @ error/import.c/ImportImageCommand/362.
./dato.py: línea 5: error sintáctico cerca del elemento inesperado `('
./dato.py: línea 5: `s = socket.socket()'
Este es el codigo .py

Código:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import socket

s = socket.socket()
s.bind((“localhost”, 9999))
s.listen(10)

sc, addr = s.accept()

while True:
    recibido = sc.recv(1024)
    if recibido == “quit”:
	break
    print “Recibido:”, recibido
    sc.send(recibido)

print “adios”

sc.close()
s.close()
Agradecería su ayuda, este es mi primer tema en foros del web, mas tarde termino de llenar mis datos y colocar mi avatar.

Gracias. @diegoug
  #2 (permalink)  
Antiguo 26/05/2011, 15:12
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Conección por socket en phython

Lo primero que va es el shebang

Ademas de que tienes mal indentado el break, no se como lo hiciste para ponerle esas comillas unicode. Por todo lo demas esta bien.

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # servidor.py
  4. import socket
  5.  
  6. s = socket.socket()
  7. s.bind(("localhost", 9999))
  8. s.listen(10)
  9.  
  10. sc, addr = s.accept()
  11.  
  12. while True:
  13.     recibido = sc.recv(1024)
  14.     if recibido == "quit":
  15.         break
  16.     print "Recibido:", recibido
  17.     sc.send(recibido)
  18.  
  19. print "adios"
  20.  
  21. sc.close()
  22. s.close()

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # cliente.py
  4. import socket
  5.  
  6. s = socket.socket()
  7. s.connect(("localhost", 9999))
  8.  
  9. while True:
  10.       mensaje = raw_input("> ")
  11.       s.send(mensaje)
  12.       if mensaje == "quit":
  13.          break
  14.  
  15. print "adios"
  16.  
  17. s.close()


Link del tutorial
  #3 (permalink)  
Antiguo 26/05/2011, 22:45
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Conección por socket en phython

La cuestión es que estoy haciendo un programa que me capte el dato GPS de mi celular ?? mandando el dato por TCP, cuando inicio el programa el se queda esperando el dato, el celular solo manda latitud y longitud a mi ip fija "localhost" que es como queda configurado.

El shebang creo que esta bien y es el primero configurado:

#!/usr/bin/python
# -*- coding: utf-8 -*-

Las comillas unicode Kate me las coloco automáticamente lanzándome un aviso, si la quito me sale esto en la terminal:

SyntaxError: Non-ASCII character '\xc2' in file ./dato.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Por otro lado se corrigió la sintaxis como me mostraste en el código anterior, fue un error del copie, pegue y las tabulaciones, el programa se queda esperando el dato.

Como comente anteriormente, solo necesito que el servidor me muestre el dato en pantalla que esta entrando por el puerto 9999 de forma abierta, intentando NO hacer una conexión de lado del CLIENTE al servidor, no se que me falta ??

Gracias.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #4 (permalink)  
Antiguo 27/05/2011, 07:54
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Conección por socket en phython

Cita:
Iniciado por diegoug Ver Mensaje
el celular solo manda latitud y longitud a mi ip fija "localhost" que es como queda configurado.
Localhost no es tu ip fija, localhost (o 127.0.0.1) sirve para autoreferenciarte. Muy probablemente se los este envio a si mismo (al celular).
¿Como estas envíando paquetes TCP a tu computadora desde tu celular?

Cita:
Iniciado por diegoug Ver Mensaje
solo necesito que el servidor me muestre el dato en pantalla que esta entrando por el puerto 9999 de forma abierta,
Hasta aqui todo normal


Cita:
Iniciado por diegoug Ver Mensaje
Intentando NO hacer una conexión de lado del CLIENTE al servidor, no se que me falta ??
?? Ok esto ya no esta muy claro. Modelo cliente/servidor sin cliente?
  #5 (permalink)  
Antiguo 27/05/2011, 09:38
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Conección por socket en phython

El cliente esta configurado para mandar un dato a mi ip fija, lo que quiero es que python reciba el dato y me lo muestre como caiga, nada mas.

La cuestión es que le programación para el gps es por los comando del fabricante, claro que ya logre que transmitiera a otro servidor, pero quiero hacer reformas arrancando un proyecto nuevo basado en la eficiencia de python.

Entonces el código del lado del cliente no es python, pero el de mi servidor si.

Si te das cuenta, solo estoy escribiendo el código del lado del servidor, no el del cliente, pero en el lado del cliente manda el dato por red celular mediante TCP a una ip fija ya configurada como la mía y a un puerto abierto que en este caso coloque 9999.

En mi código coloco "localhost" ya que es mi servidor personal, lo cambio por mi ip ?? o asi queda bien ??

La idea es capturar solo el dato, como sea que entre, pero nada pasa ?? se queda en espera.

Gracias
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #6 (permalink)  
Antiguo 27/05/2011, 09:41
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Conección por socket en phython

Esto que quiero hacer no es una conección normal de pc a otro pc, es de recibir el dato de un dispositivo, de un fabricante que esta intentado entrar a mi ip fija por un puerto determinado, solo necesito que me lo muestre en pantalla con que código.

Gracias :)
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #7 (permalink)  
Antiguo 27/05/2011, 10:09
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Conección por socket en phython

Ok tu problema no es de programación, por que el servidor esta bien codificado.

Lo que pasa es que tienes problemas al intentar conectarte.
¿Cual es tu IP fija, si se puede saber?
¿Estas desde una red interna o lo haces a través de Internet?
->Si es desde Internet tienes que configurar tu router para que pueda escuchar desde ese puerto.
-> ¿Si es red interna es wifi o bluetooth o alambrica?
¿Tienes algún firewall en tu computadora/servidor? -> Si es así desactivalo o abre el puerto

Entiendo que quieres pasar datos TCP por tu celular a una computadora, usando un pequeño script en python para obtener los datos. La idea se escucha muy factible pero necesito saber como lo estas intentando hacer para poderte decir en que puedes estar fallando.
  #8 (permalink)  
Antiguo 27/05/2011, 16:25
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Pregunta Respuesta: Conección por socket en phython

Ok.

Yo le pedí a telmex datos para instalar una ip fija, ellos hacían los cambio y me la asignaron, yo solo configure el servidor, cuando la asignaron me dijeron no tiene ninguna restricción "Red desmilitarizada" y que solo estaba bloqueado el puerto 80 por cuestiones de seguridad.

El sistema de computadores que tengo son un servidor de archivos directo al router inalambrico y mi portátil que quedo como servidor de pruebas con la ip fija.

Mi portátil es un Debian Squeeze estable, le monte un servidor apache y las bases de datos para trabajar el dato que entra con phython.

Mire lo que me comentaste de los puertos y encontre este tema en el foro de Debian en español "[URL="http://www.esdebian.org/foro/30515/abrir-puertos-torrent-debian"]Abrir puertos para un Torrent en Debian (Iptables) [Solucionado][/URL]" yo creo que quedo bien de esta manera:
Código:
iptables -A INPUT -p tcp --dport 3333 -j ACCEPT
Pero igualmente se queda esperando algo ?? como si no entrara el dato a mi portatil, le hice una modificaciones al código pero nada, no se si hay error de lógica o de sintaxis ??

Código:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket

s = socket.socket()
s.bind(("localhost", 3333))
s.listen(10)

sc, addr = s.accept()

while True:
  recibido = sc.recv(1024)
  if recibido >= 0 :
    break
  print "Recibido:", recibido
  sc.send(recibido)

print "adios"

sc.close()
s.close()
Gracias.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #9 (permalink)  
Antiguo 27/05/2011, 16:41
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Conección por socket en phython

Corre el script de python y haz un scan de puertos con nmap para ver si tienes efectivamente ese puerto abierto.

Como te dije lo mas probable es que tengas que configurar el puerto en tu router, en mi trabajo tenemos IP fija pero aun así tenemos que abrir puertos. Entra a http://home para ver si puedes cambiar la configuración de tu router y abrir los puertos.

Eso si lo mejor es que hagas un scan de puerto(s) para que veas si efectivamente esta abierto o no, si esta abierto entonces lo mas probable es que sea el cliente.

Usa esta pagina para saber cual es tu ip publica.
  #10 (permalink)  
Antiguo 28/05/2011, 10:36
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Información Respuesta: Conección por socket en phython

Buena por esa "nmap" excelente herramienta para ver los puertos, resulta que mande un comando para ver si los puertos estaban abiertos y este fue el resultado:

Código:
nmap -v -A MI_IP_FIJA

Starting Nmap 5.00 ( http://nmap.org ) at 2011-05-28 11:22 COT
NSE: Loaded 30 scripts for scanning.
Initiating Parallel DNS resolution of 1 host. at 11:22
Completed Parallel DNS resolution of 1 host. at 11:22, 0.02s elapsed
Initiating SYN Stealth Scan at 11:22
Scanning Static-IP-crMI_IP_FIJA.cable.net.co (MI_IP_FIJA) [1000 ports]
Discovered open port 111/tcp on MI_IP_FIJA
Discovered open port 80/tcp on MI_IP_FIJA
Discovered open port 21/tcp on MI_IP_FIJA
Discovered open port 631/tcp on MI_IP_FIJA
Discovered open port 8010/tcp on MI_IP_FIJA
Completed SYN Stealth Scan at 11:22, 0.08s elapsed (1000 total ports)
Initiating Service scan at 11:22
Scanning 5 services on Static-IP-crMI_IP_FIJA.cable.net.co (MI_IP_FIJA)
Completed Service scan at 11:23, 6.15s elapsed (5 services on 1 host)
Initiating OS detection (try #1) against Static-IP-crMI_IP_FIJA.cable.net.co (190.158.253.218)
Retrying OS detection (try #2) against Static-IP-crMI_IP_FIJA.cable.net.co (190.158.253.218)
Retrying OS detection (try #3) against Static-IP-crMI_IP_FIJA.cable.net.co (190.158.253.218)
Retrying OS detection (try #4) against Static-IP-crMI_IP_FIJA.cable.net.co (190.158.253.218)
Retrying OS detection (try #5) against Static-IP-cr1MI_IP_FIJA.cable.net.co (190.158.253.218)
NSE: Script scanning MI_IP_FIJA.
NSE: Starting runlevel 1 scan
Initiating NSE at 11:23
Completed NSE at 11:23, 5.08s elapsed
NSE: Script Scanning completed.
Host Static-IP-crMI_IP_FIJA.cable.net.co (MI_IP_FIJA) is up (0.000049s latency).
Interesting ports on Static-IP-crMI_IP_FIJA.cable.net.co (MI_IP_FIJA):
Not shown: 995 closed ports
PORT     STATE SERVICE VERSION
21/tcp   open  ftp     ProFTPD 1.3.1
80/tcp   open  http    Apache httpd 2.2.16 ((Debian))
|_ html-title: Index of /
111/tcp  open  rpcbind
|  rpcinfo:  
|  100000  2    111/udp  rpcbind  
|  100024  1  39220/udp  status   
|  100000  2    111/tcp  rpcbind  
|_ 100024  1  38188/tcp  status   
631/tcp  open  ipp     CUPS 1.4
8010/tcp open  xmpp?
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=5.00%D=5/28%OT=21%CT=1%CU=32456%PV=N%DS=0%G=Y%TM=4DE12178%P=i686-
OS:pc-linux-gnu

Uptime guess: 0.002 days (since Sat May 28 11:20:55 2011)
Network Distance: 0 hops
TCP Sequence Prediction: Difficulty=205 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: OS: Unix

Read data files from: /usr/share/nmap
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.86 seconds
           Raw packets sent: 1095 (51.990KB) | Rcvd: 2210 (98.720KB)
No muestro mi (MI_IP_FIJA) ya que este es un servidor de pruebas y no me gustaría una denegación hasta poder configurar iptables.

Por lo que veo creo que es el puerto, que no esta abierto:

Código:
Discovered open port 111/tcp on MI_IP_FIJA
Discovered open port 80/tcp on MI_IP_FIJA
Discovered open port 21/tcp on MI_IP_FIJA
Discovered open port 631/tcp on MI_IP_FIJA
Discovered open port 8010/tcp on MI_IP_FIJA
Habría algún problema si lo hago en uno de estos puertos abiertos excepto el puerto 80, como el puerto 21?

Nota de instalación de nmap en Debian Squeeze:
Código:
# aptitude install nmap
Gracias por la info y la herramienta.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #11 (permalink)  
Antiguo 28/05/2011, 11:52
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Conección por socket en phython

Si no se esta ocupando uno de esos puertos puedes usarlo para el servidor hecho en python.

Te recomiendo usar un puerto mayor a 1024 de otro modo tendrías que correr tu proceso como root.
Fuente

Última edición por razpeitia; 28/05/2011 a las 16:14
  #12 (permalink)  
Antiguo 07/06/2011, 10:05
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Respuesta: Conección por socket en phython

Ok para continuar el tema, en esdebian.org me recomendaron mirar el puerto con NetCat y pues dio buenos resultados ya que si encontré el dato:

Código:
# nc -l -p 3333
>491638263095+0466886-0741120200000012<
>491638263097+0466886-0741120200004312<
Me dijeron que no capta el dato es porque:

"De ser así estás equivocado, porque el script anterior no hace que el servidor escuche conexiones, sino que intente conectarse como cliente a su mismo puerto 3333"

Yo necesito es escuchar de forma permanente, manipular el dato descomponer lo, trabajarlo en variables y almacenarlo en una base de datos mysql.

Alguna idea ???
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #13 (permalink)  
Antiguo 07/06/2011, 11:42
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Conección por socket en phython

Si, de hecho hace unos días acabo de hacer un cliente y servidor para android usando sockets.

Lo que me llevo que efectivamente mi script esta incorrecto, pero tiene una fácil solución:
Código Python:
Ver original
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import socket
  4.  
  5. s = socket.socket()
  6. s.bind(("0.0.0.0", 3333))
  7. s.listen(10)
  8.  
  9. sc, addr = s.accept()
  10.  
  11. while True:
  12.   recibido = sc.recv(1024)
  13.   if recibido >= 0 :
  14.     break
  15.   print "Recibido:", recibido
  16.   sc.send(recibido)
  17.  
  18. print "adios"
  19.  
  20. sc.close()
  21. s.close()

Nota que 0.0.0.0 sirve para escuchar cualquier conexión desde cualquier punto y no solo desde tu maquina.
  #14 (permalink)  
Antiguo 13/06/2011, 09:23
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 13 años, 5 meses
Puntos: 1
Exclamación Respuesta: Conección por socket en phython

Pero me sigue saliendo un error:

Código:
./dato.py
Traceback (most recent call last):
  File "./dato.py", line 6, in <module>
    s.bind(("0.0.0.0", 3333))
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use
Me dice que la dirección "0.0.0.0", 3333 ya esta siendo usada ??
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #15 (permalink)  
Antiguo 13/06/2011, 10:04
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Conección por socket en phython

Tienes algo escuchando ese puerto. Puede ser otra aplicación o puede ser que no cerraste adecuadamente una conexión anterior que hiciste.

Intenta con otros puertos.

Etiquetas: debian, linux, socket, squeeze
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 08:12.