English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
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 secuencia | Descripción del método |
1 | public ServerSocket(int port) throws IOException Cree un socket de servidor que se binde a un puerto específico. |
2 | public 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. |
3 | public 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. |
4 | public 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 secuencia | Descripción del método |
1 | public int getLocalPort() Devuelve el puerto en el que escucha este socket. |
2 | public Socket accept() throws IOException Escucha y acepta la conexión a este socket. |
3 | public void setSoTimeout(int timeout) Activa mediante la especificación de un valor de tiempo de espera./Deshabilita SO_TIMEOUT en milisegundos. |
4 | public void bind(SocketAddress host, int backlog) Asigna un ServerSocket a una dirección específica (dirección IP y puerto). |
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 secuencia | Descripción del método |
1 | public Socket(String host, int port) throws UnknownHostException, IOException. Crea un socket de flujo y lo conecta al puerto especificado del host. |
2 | public Socket(InetAddress host, int port) throws IOException Crea un socket de flujo y lo conecta al puerto especificado de la dirección IP. |
3 | public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. Crea un socket y lo conecta al puerto remoto especificado del host remoto. |
4 | public 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. |
5 | public 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 secuencia | Descripción del método |
1 | public void connect(SocketAddress host, int timeout) throws IOException Conecta este socket al servidor y especifica un valor de tiempo de espera. |
2 | public InetAddress getInetAddress() Devuelve la dirección conectada del socket. |
3 | public int getPort() Devuelve el puerto remoto al que está conectado este socket. |
4 | public int getLocalPort() Devuelve el puerto local al que está asociado este socket. |
5 | public SocketAddress getRemoteSocketAddress() Devuelve la dirección del extremo del socket conectado, o null si no está conectado. |
6 | public InputStream getInputStream() throws IOException Devuelve el flujo de entrada de este socket. |
7 | public OutputStream getOutputStream() throws IOException Devuelve el flujo de salida de este socket. |
8 | public void close() throws IOException Cerrar este socket. |
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 secuencia | Descripción del método |
1 | static InetAddress getByAddress(byte[] addr) En el caso de la dirección IP original proporcionada, devuelve un objeto InetAddress. |
2 | static InetAddress getByAddress(String host, byte[] addr) Crea InetAddress según el nombre de host y la dirección IP proporcionados. |
3 | static InetAddress getByName(String host) Determina la dirección IP del host en caso de nombre de host dado. |
4 | String getHostAddress() Devuelve la dirección IP como cadena de texto (en forma de texto). |
5 | String getHostName() Obtiene el nombre del host de esta dirección IP. |
6 | static InetAddress getLocalHost() Devuelve la máquina local. |
7 | String toString() Convertir esta dirección IP a String. |
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(); } } }
以下 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!