Este artículo describe una configuración de servidor y cliente unidireccional muy básica en la que un cliente se conecta, envía mensajes al servidor y el servidor los muestra mediante una conexión de socket. Hay muchas cosas de bajo nivel que deben suceder para que estas cosas funcionen, pero el paquete de redes API de Java (java.net) se encarga de todo eso, haciendo que la programación de redes sea muy fácil para los programadores.
Programación del lado del cliente
Establecer una conexión de socket
Para conectarnos a otra máquina necesitamos una conexión de enchufe. Una conexión de socket significa que las dos máquinas tienen información sobre la ubicación de la red (dirección IP) y el puerto TCP de la otra. La clase java.net.Socket representa un Socket. Para abrir un socket:
Socket socket = new Socket(“127.0.0.1”, 5000)
- El primer argumento: dirección IP del servidor . (127.0.0.1 es la dirección IP de localhost, donde el código se ejecutará en la única máquina independiente).
- El segundo argumento – Puerto TCP . (Solo un número que representa qué aplicación ejecutar en un servidor. Por ejemplo, HTTP se ejecuta en el puerto 80. El número de puerto puede ser de 0 a 65535)
Comunicación
Para comunicarse a través de una conexión de socket, los flujos se utilizan tanto para la entrada como para la salida de los datos.
Cerrar la conexión
La conexión de socket se cierra explícitamente una vez que se envía el mensaje al servidor.
En el programa, el Cliente sigue leyendo la entrada de un usuario y la envía al servidor hasta que se escribe «Over».
Implementación Java
Java
// A Java program for a Client import java.net.*; import java.io.*; public class Client { // initialize socket and input output streams private Socket socket = null; private DataInputStream input = null; private DataOutputStream out = null; // constructor to put ip address and port public Client(String address, int port) { // establish a connection try { socket = new Socket(address, port); System.out.println("Connected"); // takes input from terminal input = new DataInputStream(System.in); // sends output to the socket out = new DataOutputStream(socket.getOutputStream()); } catch(UnknownHostException u) { System.out.println(u); } catch(IOException i) { System.out.println(i); } // string to read message from input String line = ""; // keep reading until "Over" is input while (!line.equals("Over")) { try { line = input.readLine(); out.writeUTF(line); } catch(IOException i) { System.out.println(i); } } // close the connection try { input.close(); out.close(); socket.close(); } catch(IOException i) { System.out.println(i); } } public static void main(String args[]) { Client client = new Client("127.0.0.1", 5000); } }
Programación del servidor
Establecer una conexión de socket
Para escribir una aplicación de servidor se necesitan dos sockets.
- Un ServerSocket que espera las requests del cliente (cuando un cliente crea un nuevo Socket())
- Un socket simple y antiguo para usar en la comunicación con el cliente.
El método de comunicación
getOutputStream() se utiliza para enviar la salida a través del socket.
Cierre la conexión
Después de terminar, es importante cerrar la conexión cerrando el socket y los flujos de entrada/salida.
Java
// A Java program for a Server import java.net.*; import java.io.*; public class Server { //initialize socket and input stream private Socket socket = null; private ServerSocket server = null; private DataInputStream in = null; // constructor with port public Server(int port) { // starts server and waits for a connection try { server = new ServerSocket(port); System.out.println("Server started"); System.out.println("Waiting for a client ..."); socket = server.accept(); System.out.println("Client accepted"); // takes input from the client socket in = new DataInputStream( new BufferedInputStream(socket.getInputStream())); String line = ""; // reads message from client until "Over" is sent while (!line.equals("Over")) { try { line = in.readUTF(); System.out.println(line); } catch(IOException i) { System.out.println(i); } } System.out.println("Closing connection"); // close connection socket.close(); in.close(); } catch(IOException i) { System.out.println(i); } } public static void main(String args[]) { Server server = new Server(5000); } }
Puntos importantes
- La aplicación del servidor crea un ServerSocket en un puerto específico que es el 5000. Esto hace que nuestro servidor escuche las requests de los clientes que ingresan al puerto 5000.
- Luego, el servidor crea un nuevo socket para comunicarse con el cliente.
socket = server.accept()
- El método accept() bloquea (simplemente se sienta allí) hasta que un cliente se conecta al servidor.
- Luego tomamos la entrada del socket usando el método getInputStream(). Nuestro Servidor sigue recibiendo mensajes hasta que el Cliente envía «Over».
- Una vez que hayamos terminado, cerramos la conexión cerrando el socket y el flujo de entrada.
- Para ejecutar la aplicación Cliente y Servidor en su máquina, compile ambas. Luego, primero ejecute la aplicación del servidor y luego ejecute la aplicación del Cliente.
Para ejecutar en Terminal o Símbolo del sistema
Abra dos ventanas una para Servidor y otra para Cliente
1. Primero ejecute la aplicación del servidor como,
$ java Server
El servidor comenzó
Esperando un cliente…
2. Luego ejecute la aplicación Cliente en otro terminal como,
$ java Client
Mostrará: Conectado y el servidor acepta al cliente y muestra,
Cliente aceptado
3. Luego puede comenzar a escribir mensajes en la ventana del Cliente. Aquí hay una entrada de muestra para el cliente
Hello I made my first socket connection Over
que el Servidor recibe y muestra simultáneamente,
Hello I made my first socket connection Over Closing connection
Tenga en cuenta que enviar «Over» cierra la conexión entre el Cliente y el Servidor como se dijo antes.
Si está utilizando Eclipse o similares,
- Compile ambos en dos terminales o pestañas diferentes
- Ejecute primero el programa del servidor
- Luego ejecute el programa Cliente
- Escriba mensajes en la Ventana del Cliente que serán recibidos y mostrados por la Ventana del Servidor simultáneamente.
- Escriba Sobre para terminar.
Este artículo es una contribución de Souradeep Barua . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA