Download Introducción a Sockets II Archivo

Document related concepts
no text concepts found
Transcript
Introducción a las
Comunicaciones en Red
1
import java.net.InetAddress;
import java.net.UnknownHostException;
public class PruebaSockets {
public static void main(String[] args) {
try {
System.out.println("URL & Direccion IP: " );
InetAddress direccion = InetAddress.getByName("www.udistrital.edu.co");
System.out.println(direccion);
System.out.println("Direccion IP: " );
int temp = direccion.toString().indexOf('/');
direccion = InetAddress.getByName(direccion.toString().substring(temp + 1));
System.out.println(direccion);
System.out.println("Nombre & Direccion IP actual de LocalHost" );
direccion = InetAddress.getLocalHost();
System.out.println(direccion);
System.out.println("Direccion IP del LocalHost: " );
temp = direccion.toString().indexOf('/');
direccion = InetAddress.getByName(direccion.toString().substring(temp + 1));
System.out.println(direccion);
System.out.println("Nombre actual de LocalHost" );
System.out.println(direccion.getHostName());
System.out.println("Direccion IP actual de LocalHost" );
byte[] bytes = direccion.getAddress();
for (int cnt = 0; cnt < bytes.length; cnt++) {
int uByte = bytes[cnt] < 0 ? bytes[cnt] + 256 : bytes[cnt];
System.out.print(uByte + " ");
}
System.out.println();
} catch (UnknownHostException e) {
System.out.println(e);
System.out.println("Debes estar conectado para que esto funcione bien.");
}
}
}
Cada paquete enviado por una capa se compone de
control + datos
El conjunto control + datos de una capa viaja en los
datos de la capa superior
La comunicación entre procesos a través de
sockets se basa en la filosofía CLIENTE SERVIDOR
Tipos de Sockets
Socket de flujo (orientado a conexión): al
conectar se realiza una búsqueda de un camino
libre entre origen y destino. Se mantiene el
camino en toda la conexión
Socket de datagrama (no orientado a
conexión): no se fija un camino. Cada paquete
podrá ir por cualquier sitio. No se garantiza la
recepción secuencial
Sockets Orientados a la Conexión
Direcciones de Sockets
1. Cada socket debe tener asignada una dirección
única
Dirección de host (32 bits) + puerto (16
bits)+protocolo
2. Las direcciones se usan para:
Asignar una dirección local a un socket (bind)
Especificar una dirección remota (connect o
sendto)
3. Las direcciones son dependientes del dominio
4. Cada dominio usa una estructura específica
Direcciones en AF_UNIX (struct sockaddr_un)
Direcciones en AF_INET(struct sockaddr_in)
Números de puerto
Algunos conocidos:
• ftp: 20 y 21
• telnet: 23
• SMTP: 25
• Time: 37
• www-http: 80
Rangos:
Puertos en una máquina ~ 65536 puertos posibles
1. Reservados por la IANA para aplicaciones de
Internet: 0-1023 (también llamados well-known
puertos)
2. Puertos entre 1024 y 49151 son puertos registrados
para ser usados por los servicios
3. Puertos por encima de 65535 para uso privado
En la parte del servidor se tiene:
public final class java.net.ServerSocket extends
java.lang.Object
A) Constructores :
public ServerSocket (int port) throws IOException
Se crea un socket local al que se enlaza el puerto especificado en
el parámetro port, si se especifica un 0 en dicho parámetro creará
el socket en cualquier puerto disponible. Puede aceptar hasta 50
peticiones en cola pendientes de conexión por parte de los
clientes.
public ServerSocket (int port , int count) throws IOException
Aquí, el parámetro count sirve para que puede especificarse, el
número máximo de peticiones de conexión que se pueden
mantener en cola.
B) Métodos :
public Socket accept () throws IOException
Sobre un ServerSocket se puede realizar una espera de conexión por parte del
cliente mediante el método accept(). El proceso espera a que se realice una
conexión por parte del cliente para seguir su ejecución. Una vez que se ha
establecido una conexión por el cliente, este método devolverá un objeto tipo
Socket, a través del cual se establecerá la comunicación con el cliente.
public void close () throws IOException
socket.
Se encarga de cerrar el
public InetAddress getInetAddress ()
Retorna la dirección IP remota a la cual está conectado el socket. Si no lo está
retornará null .
public int getLocalPort ()
que está escuchando el socket.
public String toString( )
representando el socket
Retorna el puerto en el
Retorna un string
En la parte del cliente :
public final class java.net.Socket extends java.lang.Object
A) Constructores :
public Socket (InetAddress address, int port) throws IOException
Crea un StreamSocket y lo conecta al puerto remoto y dirección IP remota
especificados.
public Socket (InetAddress address, int port , boolean stream) throws
IOException
Ídem a la anterior incluyendo el parámetro booleano stream que si es true creará un
StreamSocket y si es
false un DatagramSocket (En desuso).
public Socket (String host, int port) throws UnKnownHostException,
IOException
Crea un StreamSocket y lo conecta al número de puerto y al nombre de host
especificados.
public Socket (String host , int port , boolean stream) throws IOException
Ídem al anterior incluyendo el parámetro booleano stream que si es true creará un
StreamSocket y si es
false un DatagramSocket (En desuso).
B) MÉTODOS :
public void close() throws IOException
Se encarga de cerrar el socket.
public InetAddress getInetAddress () Retorna la dirección IP remota a la que
se conecta el socket.
public InputStream getInputStream () throws IOException
Retorna un input stream para la lectura de bytes desde el socket.
public int getLocalPort() Retorna el puerto local al que está conectado el
socket.
public OutputStream getOutputStream () throws IOException
Retorna un output stream para la escritura de bytes hacia el socket.
public int getPort () Retorna el puerto remoto al que está conectado el socket.
Ejemplo Cliente Servidor
import java.io.*;
import java.net.*;
class Servidor {
int PUERTO = 5000;
public Servidor() {
try {
ServerSocket sServidor = new ServerSocket(PUERTO);
System.out.println("Servidor --> Puerto de Escucha: " + PUERTO);
for (int numCli = 0; numCli < 3; numCli++) {
Socket sCliente = sServidor.accept(); // Crea objeto
System.out.println("Sirvo al cliente " + numCli);
OutputStream aux = sCliente.getOutputStream();
DataOutputStream flujo = new DataOutputStream(aux);
flujo.writeUTF("Cliente No.: " + numCli +
" Direccion IP Cliente: "+sCliente.getInetAddress());
sCliente.close();
}
System.out.println("Demasiados clientes por hoy");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] arg) {
new Servidor();
}
}
import java.io.*;
import java.net.*;
class Cliente {
String HOST = "localhost";
int PUERTO = 5000;
public Cliente() {
try {
Socket sCliente = new Socket(HOST, PUERTO);
InputStream aux = sCliente.getInputStream();
DataInputStream flujo = new DataInputStream(aux);
System.out.println(flujo.readUTF());
sCliente.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] arg) {
new Cliente();
}
}
Ejercicio
Usando sockets orientados a la conexión,
codificar una aplicación cliente-servidor donde los
procesos clientes envíen dos números separados
por un carácter, y el servidor muestre el resultado
de una suma