Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capa de Internet
La capa de Internet, también conocida como capa de red o capa IP, acepta y
transfiere paquetes para la red. Esta capa incluye el famoso protocolo de
Internet (IP), el protocolo de resolución de direcciones (ARP) y el protocolo de
mensajes de control de Internet (ICMP).
Protocolo IP
El siguiente código hade uso del método anterior para obtener la IP del
smartphone:
if (inetAddress.isSiteLocalAddress())
{
ip += "IP: " + inetAddress.getHostAddress() +
"\n";
}
} catch (SocketException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
ip += "¡Algo fue mal! " + e.toString() + "\n";
}
return ip;
}
Protocolo ARP
Protocolo ICMP
Capa de transporte
Protocolo TCP
Protocolo UDP
Capa de aplicación
Sockets
Los sockets stream ofrecen un servicio orientado a conexión, donde los datos
se transfieren como un flujo continuo, sin encuadrarlos en registros o bloques.
Este tipo de socket se basa en el protocolo TCP que, tal y como se ha
comentado antes, es un protocolo orientado a conexión. Esto implica que antes
de transmitir información hay que establecer una conexión entre los dos
sockets. Mientras uno de los sockets atiende peticiones de conexión (servidor),
el otro solicita la conexión (cliente). Una vez que los dos sockets están
conectados, ya se puede transmitir datos en ambas direcciones. El protocolo
incorpora de forma transparente al programador la corrección de errores. Es
decir, si detecta que parte de la información no llegó a su destino
correctamente, esta volverá a ser trasmitida. Además, no limita el tamaño
máximo de información a transmitir.
Programación de Sockets
Los permisos en el manifest para las conexiones cliente / servidor pueden ser
únicamente:
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
Socket miCliente;
miCliente = new Socket(IPservidor, numeroPuerto);
Donde IPservidor será la IP del equipo con el que intentamos una conexión y
numeroPuerto es el puerto (un número) sobre el cual nos queremos conectar.
Cuando se selecciona un número de puerto, se debe tener en cuenta que los
puertos en el rango 0-1023 están reservados para usuarios con muchos
privilegios (superusuarios o root). Estos puertos son los que utilizan los
servicios estándar del sistema como email, ftp o http. Para las aplicaciones que
se desarrollen, es importante asegurarse la selección de un puerto por encima
del 1023.
Socket miCliente;
try {
miCliente = new Socket(IPservidor, numeroPuerto);
}
catch(IOException e)
{
System.out.println(e);
}
Socket miServicio;
try {
miServicio = new ServerSocket(numeroPuerto);
}
catch(IOException e)
{
System.out.println(e);
}
Creación de streams
Streams de entrada
DataInputStream entrada;
try {
entrada = new DataInputStream(miCliente.getInputStream());
}
catch(IOException e)
{
System.out.println(e);
}
DataInputStream entrada;
try {
entrada = new DataInputStream(socketServicio.getInputStream());
}
catch(IOException e)
{
System.out.println(e);
}
Streams de Salida
PrintStream salida;
try {
salida = new PrintStream(miCliente.getOutputStream());
}
catch(IOException e)
{
System.out.println(e);
}
try {
PrintWriter out = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream())),
true);
out.println(mensaje);
catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
DataOutputStream salida;
try {
salida = new DataOutputStream(miCliente.getOutputStream());
}
catch(IOException e)
{
System.out.println(e);
}
PrintStream salida;
try {
salida = new PrintStream(socketServicio.getOutputStream());
}
catch(IOException e)
{
System.out.println(e);
}
Cierre de sockets
try
{
salida.close();
entrada.close();
miCliente.close();
}
catch (IOException e)
{
System.out.println(e);
}
try
{
salida.close();
entrada.close();
socketServicio.close();
miServicio.close();
}
catch (IOException e)
{
System.out.println(e);
}
A continuación se detalla parte del código para lograr una conexión exitosa
entre dos terminales smartphone. Uno de ellos será el cliente y el otro el
servidor.