Title: El Socket
1El Socket
- Un socket es un extremo de un link de
comunicación entre dos programas que corren en
una red. El socket esta asociado (amarrado,
bound) a ub número de port de modo que la capa
TCP pueda identificar exactamente la aplicación a
la cual están destinados los datos que llegan a
un computador. - Normalmente un servidor que corre en un
computadore específico tiene un socket que está
asociado a un número de port específico. El
servidor espera, oyendo por el socket a que un
cliente quiera establecer alguna comunicación. - Para que un cliente pueda comuncarse con el
servidor debe saber a que port está asociado el
socket por el cual el servidor está aceptando
llamadas. Para hacer una petición de conexión el
cliente debe tratar de hacer un rendezvous con
por el port donde está escuchando el servidor.
2El Socket (2)
- Si todo sale bien, el servidor acepta la
conexión. Con la aceptación el servidor recibe un
nuevo socket asociado a un port nuevo (cuyo
número no necesariamente conoce). El port
original (por donde escuchaba) queda libre para
seguir escuchando otras peticiones. - Se crea un link de comunicaciones bi-direccional
entre el servidor y el cliente. En el servidor,
el extremo está asociado al nuevo port. - En el cliente, si la conexión fue aceptada por un
servidor, se crea un socket asociado a un port
(cuyo nombre no es necesariamente conocido). - El cliente y el servidor se comunican escribiendo
datos en o leyendo datos desde el socket.
3Sockets en el Cliente en Java (1)
- Cuando un programa cliente (llamador) en java
desea conectarse con un servidor (en cualquier
lenguaje!) debe saber primero dónde esta
corriendo (host) y en que port está escuchando. - El host lo puede dar como dirección (Ej
192.123.355.211) o como nombre (ej
achawall.dcc.uchile.cl). - Sabiendo esto puede interntar un rendezvous con
el servidor. Esto se hace intentando crear una
conexión TCP y recogiendo el extremo del circuito
virtual en un socket - Socket llamando
- llamando new Socket(host,5555)
- Esto queda esperando hasta que se realiza la
conexión en el servidor y se crea el socket, que
es el extremo local de la conexión. El otro
extremo (servidor) NO está asociado al port 5555.
Ese se usó solamente para oir. - Esto puede ocacionar un error si el host no
existe, no está alcanzable por la red o no hay
ningún servidor oyendo por ese socket. Para eso
hay naturalmente un timeout. - Conviene por esto siempre ejecutarlo en un bloque
try con el catch agarrando una excepción
UnknownHostException
4Sockets en el Cliente en Java (2)
- Si todo sale bien con la conexión, podemos abrir
un canal de lectura y/u otro de escritura para
poder recibir y/o enviar datos. - PrintWriter out new PrintWriter(llamando.getOutp
utStream(), true) - BufferedReader In new BufferedReader(new
- InputStreamReader(llamando.getInputStream()))
- getInputStream y getOutputStream abren flujos de
datos orientados a la lectura y escritura de
bytes por la línea. Printwriter y BufferedReader
son filtros que permiten leer y escribir
strings. - out.print(hola pelao) out.println(como
estas) - String linea in.readLine()
- El servidor debe enviar una marca de fin de línea
(ascii) !!!! - Veamos un cliente que se conecta al servidor echo
de una máquina Unix. Modifíquelo para que se
conecte a otros servidores.
5Programas Cliente en Java
- Veamos un cliente que se conecta al servidor echo
de una máquina Unix. - Cómo habría que modificarlo para que se conecte
con el servidor date (13) y muestre la fecha?
(ver DateClient.java) - Cómo habría que modificarlo para que se conecte
con el servidor www (80) y muestre el archivo
pedido? - Cómo habría que modificarlo para que se conecte
con el servidor finger (79) y muestre la consulta
pedida? - Cómo habría que modificarlo para que se conecte
con el servidor ftp ( ???) y realice el diálogo? - Cómo habría que modificarlo para que se conecte
con el servidor pop (110) y revise cuántos mails
hay para un cierto usuario ? - Cómo se vería un cliente genérico que sirva de
marco para todo esto?
6Un Cliente Genérico
- import java.io.
- import java.net.
- public class Cliente
- public static void main(String args)
throws IOException - Socket echoSocket null
PrintWriter out null BufferedReader in
null - if (args.length ! 2)
- System.out.println(Use
java Cliente lthostgt ltportgt ltprotocologt)) - int nport Integer.parseInt(args1)
int protocolo Integer.parseInt(args2) - try
- echoSocket new
Socket(args0,nport) - out new PrintWriter(echoSocket
.getOutputStream(), true) - in new BufferedReader(new
- InputStreamReader(echoSocket.getInputStream())
) - catch (UnknownHostException
e) - System.err.println("Don't
know about host " args0) - System.exit(1)
- catch (IOException e)
7Sockets en el Servidor (1)
- El servidor debe empezar por crear un socket
servidor y asociarlo a un por desde donde
escucuchará peticiones de posibles clientes que
quieran conectarse. - ServerSocket escuchando
- escuchando new ServerSocket(5555)
- Con esto sólo ha creado el socket pero no está
escuchando. Para poder empezar a escuchar debe
hacer - Socket escuchando.accept()
- Esta instrucción hace varias cosas
- accept bloquea la ejecución del programa hasta
que recibe una petición de un cliente por ese
port - Cuando llega un requerimiento de conexión, se
crea un circuito virtual entre ambos
computadores. - El cliente recibe un extremo de esa conexión y
el servidor la otra. Este otro extremo se asocia
a otro socket que el sistemqa escoge
convenientemente.
8Sockets en el Servidor (2)
- El servidor puede ejecutar los mismos métodos
sobre su socket para abrir un flujo de entrada y
salida de datos. - Aquí es importante el PROTOCOLO DE LA
COMUNICACIÓN que no es más que las reglas que
deben seguir servidor y cliente para comunicarse.
Es muy importante que ambos tengan claros cuándo
y qué se puede/debe escribir y/o leer. Ej. Cual
es el protocolo de echo ?, de Date ? de telnet ? - Existen algunos otros métodos que se pueden
ejecutar sobre un objeto de tipo Socket (notar
que tante el servidor como el cliente estan con
un socket de la misma clase después de haber
establecido la comunicación) - InetAddress getInetAddress()
- int getPort()
- InetAddress getLocalAddress()
- int getLocalPort()
- void setSoTimeout(int timeout) int
getSoTimeoute() - void setSoLinger(Boolean on, int val) int
getSoLinger() (el delay despues de un close()) - close()
-
9 A Server for the Date
We will program now a date server a computer
which has not one (for example, a MS-Windows
computer)
3 answer with the date in another socket
4 close the connection
Client
Date server
13
1 Create the server socket 2 start listening
DateServer
DateClient2
10Sockets Transmisión de Archivos (1)
- Hagamos ahora un para de programas que se
transmitan un archivo. - El que recibe el archivo se pone a escuchar para
que le manden un archivo (es el servidor !!!) - El enviador del archivo sabe donde está
escuchando el recibidor para recibir la petición
de transmisión de archivos. - El traspaso se hace a nivel de bytes para poder
traspasar cualquier tipo de archivo. -
-
11Una situación de transmisión de archivos
2) El enviador trata de contactar al recibidor
1) El recibidor queda escuchando a ver si
alguien quiere mandarle algo
4) Send bytes
3) Read bytes from file
5) Write bytes in file
Repeat 3,4,5 until all the file is transmitted
Ver programas ArchEnviador.java ArchRecibidor.java
12Sockets Transmisión de Archivos (2)
- Hagamos ahora un par de programas algo más
inteligentes - El Servidor queda esperando una petición en un
port - Cuando llega una petición lee el nombre del
archivo a entregar - Abre el archivo y lo transmite por el socket.
- El cliente trata de conectarse con el servidor en
el port acordado - una vez que resulta envía el nombre del archivo
que quiere recuperar - Lee hasta que encuentra un fin de archivo y lo va
guardando en un archivo del mismo nombre que el
original. -
13Un servidor de archivos más inteligente
1) Filename from keyboard
2) Request file
4) Send file
3) Read File
5) Write file
Repeat 3,4,5 until all the file is transmitted
Ver programas ArchServer.java ArchCliente.java