<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; sockets</title>
	<atom:link href="http://mundogeek.net/etiqueta/sockets/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Fri, 25 May 2012 14:51:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Sockets en Python</title>
		<link>http://mundogeek.net/archivos/2008/04/12/sockets-en-python/</link>
		<comments>http://mundogeek.net/archivos/2008/04/12/sockets-en-python/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 09:00:45 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[sockets]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=1455</guid>
		<description><![CDATA[La comunicación entre distintas entidades en una red se basa en Python en el clásico concepto de sockets. Los sockets son un concepto abstracto con el que se designa al punto final de una conexión. Los programas utilizan sockets para comunicarse con otros programas, que pueden estar situados en computadoras distintas. Un socket queda definido [...]]]></description>
			<content:encoded><![CDATA[<p>La comunicación entre distintas entidades en una red se basa en Python en el clásico concepto de sockets. Los sockets son un concepto abstracto con el que se designa al punto final de una conexión.</p>
<p>Los programas utilizan sockets para comunicarse con otros programas, que pueden estar situados en computadoras distintas.</p>
<p>Un socket queda definido por la dirección IP de la máquina, el puerto en el que escucha, y el protocolo que utiliza.</p>
<p><span id="more-1455"></span></p>
<p>Los tipos y funciones necesarios para trabajar con sockets se encuentran en Python en el módulo <code>socket</code>, como no podría ser de otra forma.</p>
<p>Los sockets se clasifican en sockets de flujo (<code>socket.SOCK_STREAM</code>) o sockets de datagramas (<code>socket.SOCK_DGRAM</code>) dependiendo de si el servicio utiliza TCP, que es orientado a conexión y fiable, o UDP, respectivamente. En esta lección sólo cubriremos los sockets de flujo, que cubren un 90% de las necesidades comunes.</p>
<p>Los sockets también se pueden clasificar según la familia. Tenemos sockets UNIX (<code>socket.AF_UNIX</code>) que se crearon antes de la concepción de las redes y se basan en ficheros, sockets <code>socket.AF_INET</code> que son los que nos interesan, sockets <code>socket.AF_INET6</code> para IPv6, etc.</p>
<p>Para crear un socket se utiliza el constructor <code>socket.socket()</code> que puede tomar como parámetros opcionales la familia, el tipo y el protocolo. Por defecto se utiliza la familia AF_INET y el tipo SOCK_STREAM.</p>
<p>Veremos durante el resto de la lección cómo crear un par de programas cliente y servidor a modo de ejemplo.</p>
<p>Lo primero que tenemos que hacer es crear un objeto socket para el servidor</p>
<pre name="code" class="python">socket_s = socket.socket()</pre>
<p>Tenemos ahora que indicar en qué puerto se va a mantener a la escucha nuestro servidor utilizando el método <code>bind</code>. Para sockets IP, como es nuestro caso, el argumento de <code>bind</code> es una tupla que contiene el host y el puerto. El host se puede dejar vacío, indicando al método que puede utilizar cualquier nombre que esté disponible.</p>
<pre name="code" class="python">socket_s.bind(("localhost", 9999))</pre>
<p>Por último utilizamos <code>listen</code> para hacer que el socket acepte conexiones y <code>accept</code> para comenzar a escuchar. <code>listen</code> requiere de un parámetro que indica el número de conexiones máximas que queremos aceptar; evidentemente, este valor debe ser al menos 1.  </p>
<p><code>accept</code> se mantiene a la espera de conexiones entrantes, bloqueando la ejecución hasta que llega un mensaje.</p>
<p>Cuando llega un mensaje, <code>accept</code> desbloquea la ejecución, devolviendo un objeto <code>socket</code> que representa la conexión del cliente y una tupla que contiene el host y puerto de dicha conexión.</p>
<pre name="code" class="python">socket_s.listen(10)

socket_c, (host_c, puerto_c) = socket_s.accept()</pre>
<p>Una vez que tenemos este objeto socket podemos comunicarnos con el cliente a través suyo, mediante los métodos <code>recv</code> y <code>send</code> (o <code>recvfrom</code> y <code>sendfrom</code> en UDP) que permiten recibir o enviar mensajes respectivamente. El método <code>send</code> toma como parámetros los datos a enviar, mientras que el método <code>recv</code> toma como parámetro el número máximo de bytes a aceptar. </p>
<pre name="code" class="python">recibido = socket_c.recv(1024)
print "Recibido: ", recibido
socket_c.send(recibido)</pre>
<p>Una vez que hemos terminado de trabajar con el socket, lo cerramos con el método <code>close</code>.</p>
<p>Crear un cliente es aún más sencillo. Solo tenemos que crear el objeto <code>socket</code>, utilizar el método <code>connect</code> para conectarnos al servidor y utilizar los métodos <code>send</code> y <code>recv</code> que vimos anteriormente. El argumento de <code>connect</code> es una tupla con host y puerto, exactamente igual que bind.</p>
<pre name="code" class="python">socket_c = socket.socket()
socket_c.connect(("localhost", 9999))
socket_c.send("hola")</pre>
<p>Veamos por último un ejemplo completo. En este ejemplo el cliente manda al servidor cualquier mensaje que escriba el usuario y el servidor no hace más que repetir el mensaje recibido. La ejecución termina cuando el usuario escribe &#8220;quit&#8221;.</p>
<p>Este sería el código del script servidor:</p>
<pre name="code" class="python">import socket

s = socket.socket()
s.bind(("localhost", 9999))
s.listen(1)

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()</pre>
<p>Y a continuación tenemos el del script cliente:</p>
<pre name="code" class="python">import socket

s = socket.socket()
s.connect(("localhost", 9999))

while True:
      mensaje = raw_input("> ")
      s.send(mensaje)
      if mensaje == "quit":
         break

print "adios"

s.close()</pre>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushPython.js"></script><br />
<script language="javascript">
dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2008/04/12/sockets-en-python/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Sockets en Java</title>
		<link>http://mundogeek.net/archivos/2006/03/20/sockets-en-java/</link>
		<comments>http://mundogeek.net/archivos/2006/03/20/sockets-en-java/#comments</comments>
		<pubDate>Mon, 20 Mar 2006 11:31:50 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[red]]></category>
		<category><![CDATA[sockets]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2006/03/20/sockets-en-java/</guid>
		<description><![CDATA[En Java las comunicaciones se basan en sockets con los que trabajamos a través de flujos de datos como si de E/S de archivos se tratara. Los sockets se clasifican en sockets de flujo o sockets de datagramas dependiendo de si el servicio utiliza TCP (orientado a conexión y fiable) o UDP. En el modelo [...]]]></description>
			<content:encoded><![CDATA[<p>En Java las comunicaciones se basan en sockets con los que trabajamos a través de flujos de datos como si de E/S de archivos se tratara. Los sockets se clasifican en sockets de flujo o sockets de datagramas dependiendo de si el servicio utiliza TCP (orientado a conexión y fiable) o UDP.</p>
<p>En el modelo de sockets de flujo contamos con un objeto de tipo Socket en el cliente y en el servidor uno o más objetos Socket asociados a un ServerSocket. La E/S se realiza a través de objetos InputStream y OutputStream asociados a los Sockets.</p>
<p>El servidor crea un socket servidor que tiene como parámetro el puerto en el que a va estar escuchando las peticiones entrantes:<br />
<code>ServerSocket servicio = new ServerSocket(9999);</code></p>
<p>accept se mantiene a la espera de conexiones entrantes, bloqueando la ejecución. Cuando se establece una conexión se devuelve una instancia de Socket con la que llevar a cabo la comunicación.<br />
<code>Socket socketServicio = servicio.accept();</code></p>
<p>Los clientes crean objetos Socket para comunicarse con el servidor, por ejemplo localhost en el puerto 9999:<br />
<code>Socket cliente = new Socket("localhost", 9999);</code></p>
<p>Una vez iniciada la conexión, podemos usar getOutputStream y getInputStream para obtener los flujos de salida y entrada de datos de los sockets.<br />
<code>PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);</code><br />
<code>BufferedReader entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream()));</code></p>
<p>Y utilizar los métodos de los flujos de datos para enviar o recibir información del otro lado de la conexión:<br />
<code>salida.println("Soy el servidor");</code><br />
<code>System.out.println("Recibido " + entrada.readLine());</code></p>
<p>Por último, una vez terminada la ejecución, tenemos que cerrar los flujos de datos y el socket (en ese orden):<br />
<code>salida.close();<br />
socketServicio.close();</code></p>
<p><code>entrada.close();<br />
cliente.close();</code></p>
<p>Un ejemplo típico para enseñar estos conceptos en la práctica es un servidor eco, cuyo código podéis descargar a continuación. Para probarlo podeis utilizar telnet para conectaros al puerto 9999 en localhost (telnet localhost 9999) y por cada cadena de texto enviada al servidor, este nos responderá con el mismo texto. Utiliza el comando &#8216;bye&#8217; para terminar la conexión.</p>
<p><a href="http://mundogeek.net/wp-content/ServidorEco.java">Descarga ServidorEco.java</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2006/03/20/sockets-en-java/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
	</channel>
</rss>

