Este artículo describe una sencilla aplicación cliente del lado del servidor de programación de redes Java. Compártelo con todos para tu referencia. Los detalles son los siguientes:
En Java, utilizamos java.net.Socket y sus clases relacionadas para completar funciones relacionadas con la red. La clase Socket es muy simple y fácil de usar porque la tecnología Java oculta el complejo proceso de establecer una conexión de red y enviar datos a través de la conexión. Lo que se dice a continuación sólo se aplica al protocolo TCP.
1. Conéctese al servidor
Podemos usar el constructor de la clase Socket para abrir un socket, como
Zócalo sk = nuevo Zócalo("210.0.235.14",13);
Entre ellos, 210.0.235.14 es un objeto de cadena decimal con puntos, que representa la dirección IP (o nombre de host) del host de destino, y 13 representa el puerto designado 13 para conectarse al host de destino. El 210.0.235.14 aquí es un servidor de cronometraje ubicado en Hong Kong. El puerto predeterminado del servidor de cronometraje es generalmente 13.
Tenga en cuenta que el programa se bloquea hasta que se conecta correctamente al servidor.
A continuación, puede utilizar el método getInputStream() de la clase Socket para obtener un objeto InputStream. A través de este objeto, puede obtener la información que nos envía el host de destino:
InputStream inStream = sk.getInputStream();
De manera similar, para enviar datos al host de destino, puede llamar al método getOutputStream() para obtener un objeto de flujo de salida.
La siguiente función de ejemplo es conectarse al servidor de sincronización e imprimir la información devuelta en la salida estándar:
try { Socket sk = new Socket("210.0.235.14",13); sk.setSoTimeout(3000); InputStream inStream = sk.getInputStream(); //Obtener el objeto de flujo de entrada Scanner sc = new Scanner(inStream); / Imprime datos en la consola while(sc.hasNextLine()) { String str = sc.nextLine(); System.out.println("Salida: " + str); } sk.close(); } catch(SocketTimeoutException e) // Excepción de tiempo de espera { System.out.println("¡Tiempo de espera!") catch(Exception e); ) { e.printStackTrace();
El método setSoTimeout () en el código puede establecer el tiempo de espera, es decir, si las operaciones de lectura y escritura no se han completado después del tiempo establecido, se generará una excepción SocketTimeoutException y la conexión se puede cerrar al detectar esta excepción.
También hay un problema de tiempo de espera que debe resolverse, que es el constructor de la clase Socket.
nuevo Socket(host,puerto);
Se bloqueará indefinidamente hasta que se establezca exitosamente una conexión con el host de destino. Ciertamente esto no es lo que queremos. Podemos solucionar este problema llamando a:
Socket sk = new Socker();sk.connect(new InetSocketAddress(host,port),2000);//Establece el tiempo de espera en 2 segundos
2. Obtenga la dirección del host
El método estático getByName(nombre de host) de la clase InetAddress puede devolver un objeto InetAddress que representa una dirección de host. Este objeto incluye una secuencia de 4 bytes, que es la dirección IP del host. Luego llame al método getHostAddress() para devolver un objeto String que represente la dirección IP.
Algunos nombres de host con un gran volumen de tráfico suelen corresponder a varias direcciones IP para lograr el equilibrio de carga. Podemos obtener todas las direcciones de host llamando al método getAllByName(), que devuelve una matriz de objetos InetAddress.
El siguiente es un pequeño programa simple. La función es imprimir la dirección IP local si no se configuran parámetros en la línea de comando. Si se especifica un nombre de host, se imprimen todas las direcciones IP del host:
paquete cls; importar java.net.*; clase pública ShowIP { public static void main(String[] args) { try { if(args.length > 0) { String hostName = args[0]; ] addr = InetAddress.getAllByName(hostName); //Obtener todas las direcciones del host //Imprimir la salida a la consola for(InetAddress dirección: addr) { System.out.println(address.getHostAddress()); } } else { System.out.println(InetAddress.getLocalHost().getHostAddress()); catch(Exception e) { e.printStackTrace(); }
3. Programa del lado del servidor
Las aplicaciones del lado del servidor utilizan la clase ServerSocket para crear un socket y vincularlo al puerto local, como
Calcetín ServerSocket = nuevo ServerSocker(8000);
El método sock.accept() permite que el programa espere una conexión continuamente. Este método solo devolverá un objeto Socket que representa una nueva conexión cuando se conecte un cliente, es decir, este método se bloqueará.
Aquí generalmente es necesario abrir un nuevo hilo para cada conexión para atenderlo.
El siguiente es un ejemplo completo. El servidor espera una conexión en el puerto 8400. Cada vez que llega una conexión, se abre un nuevo hilo para atenderla y la información de la conexión se escribe en el archivo de registro:
paquete cls; importar java.io.*; importar java.net.*; importar java.util.*; clase pública ServerDemo { /** * @param args */ public static void main(String[] args) { //ServerSocket servSocket = nuevo ServerSocket(8000); ServerSocket servSocket = nuevo ServerSocket(8400); int cantidad = 0; while(true) { Cliente de socket = servSocket.accept(); ++cantidad; Fecha hora = nueva Fecha(); Solicitud de cadena = time.toString() + ":th" + cantidad + "usuario" + client.getInetAddress ( ).getHostAddress() + "Connected/n"; System.out.print(prompt); //Información de salida en la consola ServerDemo.writeLog(prompt); //Escribir en el archivo//iniciar un nuevo hilo Thread th = new Thread(new ServThread(client,amount)); th.start(); } } catch(Exception e) { e.printStackTrace(); Escriba en el archivo de registro public static void writeLog(String str) { File logFile = new File("server-log.txt"); FileWriter(logFile,true); out.append(str); out.close(); } catch(Exception e) { e.printStackTrace() } } } /* * Clase de subproceso de servicio*/ clase ServThread implementa Runnable; Cliente de socket; privado int ix; público ServThread(Socket soc,int ix) {cliente = soc = ix} public void run(); { intentar { InputStream inStream = client.getInputStream(); OutputStream outStream = client.getOutputStream(); Scanner recv = new Scanner(inStream PrintWriter send = new PrintWriter(outStream,true); ¡Unas pocas palabras! [Ingrese 'adiós' para cerrar la conexión]"); while(recv.hasNextLine()) { String str = recv.nextLine(); if(str.equals("bye")) { send.println("Nos vemos más tarde ~ ^-^"); break; } send.println("Este es un programa de prueba, aún no tiene funciones"); } Fecha hora = nueva Fecha(); Mensaje de cadena = time.toString() + ": usuario" + ix + "th" + client.getInetAddress().getHostAddress() + "Desconectado/n"; System.out.print(prompt); /Escribir en el archivo client.close(); } catch(Exception e) { e.printStackTrace();
Este programa se ha colocado en el servidor. Puede utilizar el comando telnet youhol.tk 8400 para experimentar los resultados de ejecución de este programa.
Espero que este artículo sea útil para la programación Java de todos.