El 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.
El 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.
Sockets 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”
Sockets 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.getOutputStream(), 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.
Programas 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?
Un 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 <host> <port> <protocolo>)”);
int nport = Integer.parseInt(args[1]); int protocolo = Integer.parseInt(args[2]);
try {
echoSocket = new Socket(args[0],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: "+ args[0]);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: "+args[0]);
System.exit(1);
}
protocolo(in,out, protocolo);
}
}
Sockets 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.
Sockets 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()
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
Date server
Client
13
1 Create the server socket
2 start listening
DateServer
DateClient2
Sockets: 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.
Una 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
5) Write bytes in file
3) Read bytes from file
Repeat 3,4,5 until
all the file is transmitted
Ver programas ArchEnviador.java ArchRecibidor.java
Sockets: 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.
Un servidor de archivos más inteligente
1) Filename from keyboard
2) Request file
4) Send file
5) Write file
3) Read File
Repeat 3,4,5 until
all the file is transmitted
Ver programas ArchServer.java ArchCliente.java
Descargar

ClasesCC52n