English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Control de flujo de Java

Java array

Java orientado a objetos (I)

Java orientado a objetos (II)

Java orientado a objetos (III)

Manejo de excepciones en Java

Java List (lista)

Java Queue (cola)

Conjuntos de Map de Java

Conjuntos de Java

Entrada y salida de Java (I)/O)

Reader de Java/Writer

Otras temáticas de Java

Java Programación de red

La programación de red se refiere a escribir programas que se ejecutan en múltiples dispositivos (computadoras) que están conectados entre sí a través de una conexión de red.

La biblioteca J2Las API de SE contienen clases e interfaces que proporcionan detalles de comunicación a nivel bajo. Puede usar directamente estas clases e interfaces para centrarse en resolver problemas, sin preocuparse por los detalles de la comunicación.

El paquete java.net ofrece soporte para dos protocolos de red comunes:

  • TCP:TCP (Protocolo de Control de Transmisión, en inglés) es un protocolo de comunicación en capas de transmisión orientado a conexión, confiable y basado en un flujo de bytes. La capa TCP se encuentra entre la capa IP y la capa de aplicación. TCP garantiza la comunicación confiable entre dos aplicaciones. Se utiliza comúnmente en protocolos de internet y se conoce como TCP. / IP.

  • UDP:UDP (Protocolo de Datagramas de Usuario, en inglés) se encuentra en la capa de transmisión del modelo OSI. Es un protocolo sin conexión. Proporciona datagramas para que las aplicaciones envíen datos. Debido a que UDP carece de confiabilidad y es un protocolo sin conexión, las aplicaciones generalmente deben permitir algunas pérdidas, errores o paquetes repetidos.

Este tutorial se centra principalmente en los siguientes dos temas.

  • Programación de Socket:Es el concepto de red más utilizado, que ha sido explicado en gran detalle.

  • Manejo de URL:Este tema se abordará en otro apartado, haga clic aquí para obtener más detalles sobre Manejo de URL en el lenguaje Java.

Programación de Socket

El socket utiliza TCP para proporcionar un mecanismo de comunicación entre dos computadoras. El programa cliente crea un socket y intenta conectarse con el socket del servidor.

Cuando se establece la conexión, el servidor crea un objeto Socket. Ahora, el cliente y el servidor pueden comunicarse mediante la escritura y lectura de objetos Socket.

La clase java.net.Socket representa un socket, y la clase java.net.ServerSocket proporciona un mecanismo para que los programas de servidor escuchen a los clientes y establezcan conexiones con ellos.

Los siguientes pasos ocurren al establecer una conexión TCP entre dos computadoras utilizando sockets:

  • El servidor crea un objeto ServerSocket para representar la comunicación a través del puerto en el servidor.

  • El servidor llama al método accept() de la clase ServerSocket, que espera hasta que el cliente se conecte al puerto especificado en el servidor.

  • Mientras el servidor espera, un cliente crea un objeto Socket, especificando el nombre del servidor y el número de puerto para solicitar la conexión.

  • El constructor de la clase Socket intenta conectar al cliente con el servidor y el puerto especificados. Si se establece la comunicación, se crea un objeto Socket en el cliente que puede comunicarse con el servidor.

  • En el lado del servidor, el método accept() devuelve una nueva referencia de socket en el servidor, que se conecta al socket del cliente.

Después de establecer la conexión, a través de/En el flujo O de comunicación, cada socket tiene un flujo de salida y un flujo de entrada. El flujo de salida del cliente se conecta al flujo de entrada del servidor, y el flujo de entrada del cliente se conecta al flujo de salida del servidor.

TCP es un protocolo de comunicación bidireccional, por lo que los datos pueden enviarse a través de dos flujos de datos al mismo tiempo. A continuación, se presentan algunos métodos útiles proporcionados por la clase para implementar sockets.

Métodos de la clase ServerSocket

El programa del servidor utiliza la clase java.net.ServerSocket para obtener un puerto y escuchar solicitudes de clientes.

La clase ServerSocket tiene cuatro métodos constructores:

Número de secuenciaDescripción del método
1public ServerSocket(int port) throws IOException
Cree un socket de servidor que se binde a un puerto específico.
2public ServerSocket(int port, int backlog) throws IOException
Cree un socket de servidor utilizando el backlog especificado y úsalo para bind a un puerto local específico.
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
Cree un servidor utilizando el puerto especificado, el backlog de escucha y la dirección IP local a la que se debe bind.
4public ServerSocket() throws IOException
Crea un servidor socket no asociado.

Crea un servidor socket no asociado. Si el constructor de ServerSocket no lanza una excepción, significa que tu aplicación ya se ha asociado con el puerto especificado y está escuchando solicitudes de clientes.

Aquí hay algunos métodos comunes de la clase ServerSocket:

Número de secuenciaDescripción del método
1public int getLocalPort()
  Devuelve el puerto en el que escucha este socket.
2public Socket accept() throws IOException
Escucha y acepta la conexión a este socket.
3public void setSoTimeout(int timeout)
 Activa mediante la especificación de un valor de tiempo de espera./Deshabilita SO_TIMEOUT en milisegundos.
4public void bind(SocketAddress host, int backlog)
Asigna un ServerSocket a una dirección específica (dirección IP y puerto).

Métodos de la clase Socket

La clase java.net.Socket representa el socket utilizado tanto por el cliente como por el servidor para comunicarse entre sí. El cliente obtiene un objeto Socket mediante la instanciación, mientras que el servidor obtiene un objeto Socket a través del valor de retorno del método accept().

La clase Socket tiene cinco métodos de constructor.

Número de secuenciaDescripción del método
1public Socket(String host, int port) throws UnknownHostException, IOException.
Crea un socket de flujo y lo conecta al puerto especificado del host.
2public Socket(InetAddress host, int port) throws IOException
Crea un socket de flujo y lo conecta al puerto especificado de la dirección IP.
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
Crea un socket y lo conecta al puerto remoto especificado del host remoto.
4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
Crea un socket y lo conecta al puerto remoto especificado en la dirección remota.
5public Socket()
Crear un socket no conectado mediante el tipo de SocketImpl predeterminado del sistema

Cuando el método constructor de Socket devuelve, y en realidad ha intentado conectarse al servidor y al puerto especificados.

A continuación se enumeran algunos métodos interesantes, tenga en cuenta que tanto el cliente como el servidor tienen un objeto Socket, por lo que tanto el cliente como el servidor pueden llamar a estos métodos.

Número de secuenciaDescripción del método
1public void connect(SocketAddress host, int timeout) throws IOException
Conecta este socket al servidor y especifica un valor de tiempo de espera.
2public InetAddress getInetAddress()
 Devuelve la dirección conectada del socket.
3public int getPort()
Devuelve el puerto remoto al que está conectado este socket.
4public int getLocalPort()
Devuelve el puerto local al que está asociado este socket.
5public SocketAddress getRemoteSocketAddress()
Devuelve la dirección del extremo del socket conectado, o null si no está conectado.
6public InputStream getInputStream() throws IOException
Devuelve el flujo de entrada de este socket.
7public OutputStream getOutputStream() throws IOException
Devuelve el flujo de salida de este socket.
8public void close() throws IOException
Cerrar este socket.

Métodos de la clase InetAddress

Esta clase representa la dirección de protocolo de internet (IP). A continuación se enumeran algunos métodos útiles para la programación de sockets:

Número de secuenciaDescripción del método
1static InetAddress getByAddress(byte[] addr)
En el caso de la dirección IP original proporcionada, devuelve un objeto InetAddress.
2static InetAddress getByAddress(String host, byte[] addr)
Crea InetAddress según el nombre de host y la dirección IP proporcionados.
3static InetAddress getByName(String host)
Determina la dirección IP del host en caso de nombre de host dado.
4String getHostAddress() 
Devuelve la dirección IP como cadena de texto (en forma de texto).
5String getHostName() 
 Obtiene el nombre del host de esta dirección IP.
6static InetAddress getLocalHost()
Devuelve la máquina local.
7String toString()
Convertir esta dirección IP a String.

Ejemplo de cliente Socket

El siguiente GreetingClient es un programa cliente que se conecta al servidor a través de socket, envía una solicitud y espera una respuesta.

// Nombre del archivo GreetingClient.java
 
import java.net.*;
import java.io.*;
 
public class GreetingClient
{
   public static void main(String [] args)
   {
      String serverName = args[0];
      1]
      try
      {
         System.out.println("Conectado al host: ") + serverName + ", número de puerto: " + port);
         Socket client = new Socket(serverName, port);
         System.out.println("远程主机地址:" + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
 
         out.writeUTF("Hola desde ") + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         System.out.println("Respuesta del servidor: ") + in.readUTF());
         client.close();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Socket 服务端示例

以下 GreetingServer 程序是一个服务器端应用程序,使用 Socket 来监听一个指定的端口。

// 文件名 GreetingServer.java
 
import java.net.*;
import java.io.*;
 
public class GreetingServer extends Thread
{
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException
   {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }
 
   public void run()
   {
      while(true)
      {
         try
         {
            System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
            server.close();
         }catch(SocketTimeoutException s)
         {
            System.out.println("Socket timed out!");
            break;
         catch(IOException e)
         {
            e.printStackTrace();
            break;
         }
      }
   }
   public static void main(String [] args)
   {
      int port = Integer.parseInt(args[0]);
      try
      {
         Thread t = new GreetingServer(port);
         t.run();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Compile los dos archivos java anteriores y ejecute el siguiente comando para iniciar el servicio, utilizando el puerto: 6066:

$ javac GreetingServer.java 
$ java GreetingServer 6066
Esperando conexión remota, puerto:6066...

Abra una nueva ventana de comandos y ejecute los siguientes comandos para iniciar el cliente:

$ javac GreetingClient.java 
$ java GreetingClient localhost 6066
Conectando al host: localhost,puerto:6066
Dirección del host remoto: localhost/127.0.0.1:6066
Respuesta del servidor: Gracias por la conexión:/127.0.0.1:6066
¡Adiós!