Los modelos de aplicaciones de red incluyen principalmente:
www (World Wide Web) es un sistema de navegación de información basado en el modelo cliente/servidor, basado en lenguaje HTML y protocolo HTTP, y puede proporcionar diversos servicios de Internet. La información de la red se coloca en diferentes ubicaciones del host y el servidor www utiliza enlaces de hipertexto para vincular diversa información. El cliente www (navegador) es responsable de establecer contacto con el servidor, enviar solicitudes al servidor, procesar hipermedia HTML, proporcionar una interfaz gráfica de usuario (GUI), mostrar información, etc.
En el modo de trabajo cliente/servidor, en el lado del servidor, esté preparado para aceptar comunicaciones de múltiples computadoras cliente. Con este fin, además de utilizar direcciones IP para identificar computadoras en Internet, también se introducen números de puerto para identificar subprocesos que prestan servicios en segundo plano en el lado del servidor. La combinación de número de puerto y dirección IP se denomina socket de red.
En la implementación del modo C/S en lenguaje Java, los sockets se dividen en dos categorías:
La máquina Servidor proporciona servicios para la máquina Cliente a través de puertos (direcciones de E/S de bus). La máquina Servidor proporciona varios servicios diferentes al mismo tiempo en sus diferentes puertos. El Cliente accede a un determinado puerto del Servidor y solicita al Servidor que lo atienda a través de este puerto. Regulaciones: Los números de puerto 0~1023 son para uso exclusivo del sistema. Por ejemplo, el protocolo HTTP está en el puerto 80 y el protocolo telnet está en el puerto 23. Las aplicaciones utilizan los puertos 1024~65535.
Cuando el programa Cliente y el programa Servidor necesitan comunicarse, se puede utilizar la clase Socket para establecer una conexión de socket. Piense en una conexión de socket como una llamada telefónica: inicialmente el programa Cliente establece la llamada y el programa Servidor escucha una vez completada la llamada, cualquiera de las partes puede hablar en cualquier momento;
Hay dos formas opcionales de lograr la comunicación entre las dos partes: socket de transmisión y socket de datagrama:
El socket de transmisión establece un canal de comunicación entre el programa Cliente y el programa Servidor. Cada socket puede realizar operaciones de lectura y escritura. Para cualquier extremo, el proceso de la sesión de comunicación con la otra parte es:
Establezca una conexión de socket, obtenga flujos de entrada/salida, lea/escriba datos y cierre el socket (destruya la conexión) una vez completada la comunicación.
Usando el constructor de socket, se puede establecer un objeto de socket en el lado del cliente para el servidor:
Socket (host de cadena, puerto int): host es la dirección IP del servidor, puerto es el número de puerto, estos están acordados previamente.
Por ejemplo, código:
intentar { Socket mySocket = nuevo Socket ("http://www.weixueyuan.net", 1860 }catch(IOException e){}
Luego, use el método getInputStream() para obtener el flujo de entrada, use este flujo de entrada para leer la información ingresada por el servidor en la "línea" use el método getOutputStream() para obtener el flujo de salida y use este flujo de salida para; escriba información en la "línea".
Usando el constructor ServerSocket, puede crear un objeto de socket de servidor en el servidor que acepta sockets de cliente:
ServerSocket (puerto int): especifique el número de puerto y cree un objeto ServerSocket. El número de puerto debe ser el mismo que el número de puerto llamado por el cliente. Para hacer esto, use la siguiente forma de código:
probar{ ServerSocket serverSocket = new ServerSocket(1860 }catch(IOException e){}
El programa del lado del servidor escucha en el puerto especificado. Cuando recibe una solicitud de servicio del programa Cliente, crea un objeto de socket para comunicarse con el programa Cliente correspondiente al puerto. Por ejemplo, después de ejecutar el código anterior para crear un objeto de socket de servidor y establecer el objeto serverSocket, puede usar el método aceptar() para obtener el objeto Socket y recibir la información del programa cliente desde el socket mySocket. Como se muestra en el siguiente código:
try{ Socket sc = serverSocket.accept();//ac es un objeto Socket}catch(IOException e){}
Para revocar el servicio, puede cerrar el objeto Socket sc:
sc.cerrar();
[Ejemplo] Aplicación cliente en modo C/S. Este es un ejemplo simple de comunicación de socket de transmisión del lado del cliente. El código ilustra cómo escribir el programa del lado del cliente. En el ejemplo, el programa Cliente realiza una solicitud al puerto 4441 del host del servidor. Una vez establecida la conexión, completa la lectura y escritura en el servidor.
importar java.io.*;importar java.net.*;cliente de clase pública{ public static void main(String args[]){ String s = null;Socket mySocket in = null;DataOutputStream out = null; = nuevo Socket("localhost",4441 adentro = nuevo DataInputStream(mySocket.getInputStream()); DataOutputStream(mySocket.getOutputStream()); out.writeUTF("¡buen servidor!"); while(true){ s = in.readUTF(); if(s==null) break; } mySocket.close(); }catch(IOException e){ System.out.println(“no se puede conectar”);
[Ejemplo] Aplicación del lado del servidor correspondiente a la aplicación del lado del cliente. El programa escucha en el puerto 4441. Cuando se detecta una solicitud de un cliente, se genera una cadena que contiene "Cliente, hola, soy el servidor" y se envía al cliente.
importar java.io.*;importar java.net.*;servidor de clase pública{ public static void main(String args[]){ ServerSocket server = null; Socket you = null;String s = null DataOutputStream out = null; en = nulo; prueba {servidor = nuevo ServerSocket(4441); }catch(IOException e1){ system.out.println("ERROR:" +e1); } probar{ usted = server.accept(); in = new DataInputStream(you.getInputStream()); out = new DataOutputStream(you. getOutputStream()); ); if(s!=null) break; } out.writeUTF("Hola cliente, soy el servidor"); e){System.out.println(“ERROR:”+e);} }}
Para aprovechar al máximo la capacidad de trabajo en paralelo de la computadora, el trabajo de conexión del socket se puede completar con un hilo. Cuando el cliente solicita al servidor que proporcione servicios, o cuando el servidor recibe la solicitud de servicio de un cliente, inicia un hilo dedicado a completar la comunicación de información, crea un flujo de entrada y salida en este hilo y completa el intercambio de información entre el cliente y el servidor.
[Ejemplo] Un subprograma de cliente que coloca el trabajo de conexión de socket en un subproceso. La interfaz tiene un botón de enviar mensaje, un cuadro de texto y un área de texto. La aplicación cliente primero establece una conexión de socket con el servidor. Utilice el flujo de entrada de datos para leer repetidamente la información ingresada en la línea por el servidor y mostrar la información recibida en el área de texto. Si la información recuperada es "Fin", la conexión del socket se cierra y el programa finaliza. El usuario también puede ingresar información en el cuadro de texto y presionar el botón enviar información, y el programa cliente utilizará el flujo de salida de datos para enviar el contenido del cuadro de texto al servidor.
importar java.net.*;importar java.io.*;importar java.awt.*;importar javax.swing.*;importar java.awt.event.*;importar java.applet.*;clase pública Aclient extiende los implementos del Applet Ejecutable,ActionListener{ botón JButton; JTextField textF; JTextArea socket Thread; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); nuevo JButton("Enviar información"); 20,30); setSize(450,350); JPanel p = nuevo JPanel(); p.add(textF); p.add(button); add(textA,"Centro"); add(p,"Sur"); addActionListener(this); nuevo Socket(this.getCodeBase().getHost(),4441); en = nuevo DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY()); public void run(){ String s = null; while(true){ try{ s = in.readUTF() }catch(IOException e){} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n"); ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ try{ out.writeUTF(s); }catch(IOException e1){} } else{ try{ out.writeUTF("Por favor habla" } catch(IOException e1){} } } }}
[Ejemplo] El programa utiliza el terminal 4441 para establecer una conexión de socket con el cliente. Después de que el servidor recibe la solicitud del cliente, crea un hilo con el socket del cliente y lo inicia. Si no hay ninguna aplicación de cliente, continúe monitoreando las aplicaciones de cliente. El hilo establece el flujo de datos de entrada y el flujo de datos de salida de acuerdo con el socket del cliente. El hilo utiliza in para leer la información que el cliente ingresa en la línea. Si la información recibida es "Fin", el servidor responde "Fin" y luego cierra la conexión del socket; de lo contrario, responde: "Soy el servidor que me dijiste" y la información recibida por el servidor.
importar java.net.*;importar java.io.*;importar java.awt.*;importar javax.swing.*;importar java.awt.event.*;importar java.applet.*;clase pública Aclient extiende los implementos del Applet Ejecutable,ActionListener{ botón JButton; JTextField textF; JTextArea socket Thread; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); nuevo JButton("Enviar información"); 20,30); setSize(450,350); JPanel p = nuevo JPanel(); p.add(textF); p.add(button); add(textA,"Centro"); add(p,"Sur"); addActionListener(this); nuevo Socket(this.getCodeBase().getHost(),4441); en = nuevo DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY()); public void run(){ String s = null; while(true){ try{ s = in.readUTF() }catch(IOException e){} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n"); ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ try{ out.writeUTF(s); }catch(IOException e1){} } else{ try{ out.writeUTF("Por favor habla" }catch(IOException e1){} } } }}