1. Dos problemas principales en la programación de redes
Una es cómo localizar con precisión uno o más hosts en la red, y el otro es cómo transmitir datos de manera confiable y eficiente después de encontrar el host.
En el protocolo TCP/IP, la capa IP es el principal responsable de la ubicación del host de red y el enrutamiento de la transmisión de datos. La dirección IP puede determinar de manera única un host en Internet.
La capa TCP proporciona un mecanismo de transmisión de datos confiable (TCP) o no confiable (UDP) para la aplicación, que es el objeto principal de la programación de red, y generalmente no necesita preocuparse por cómo la capa IP procesa los datos.
El modelo de programación de red más popular en la actualidad es la estructura del cliente/servidor (C/S). Es decir, una de las partes de comunicación actúa como un servidor para esperar a que el cliente envíe una solicitud y responda. El cliente se aplica al servidor cuando se necesita el servicio. El servidor generalmente siempre se ejecuta como demonio, escuchando el puerto de red. Una vez que un cliente lo solicite, comenzará un proceso de servicio para responder al cliente, y al mismo tiempo continuará escuchando el puerto de servicio en sí para que los clientes posteriores también puedan obtener el servicio de manera oportuna.
2. Dos tipos de protocolos de transmisión: TCP; UDP
TCP es la abreviatura del Tranfer Control Protocol , un protocolo orientado a la conexión que garantiza una transmisión confiable. La transmisión a través del protocolo TCP da como resultado un orden de flujos de datos sin errores. Se debe establecer una conexión entre los dos pares de enchufes del remitente y el receptor para comunicarse sobre la base del protocolo TCP. Cuando un socket (generalmente un socket de servidor) está esperando para establecer una conexión, el otro socket puede requerir una conexión. Una vez que estos dos enchufes están conectados, pueden realizar la transmisión de datos bidireccional, y ambas partes pueden realizar operaciones de envío o recepción.
UDP es la abreviatura del User Datagram Protocol . Es un protocolo sin conexión. Cada datagrama es una información independiente, incluida una fuente completa o dirección de destino. Se transmite al destino en la red por cualquier posible ruta. Por lo tanto, si puede llegar al destino, el momento de llegar al destino y la corrección del contenido no puede garantizarse.
Comparar:
UDP:
TCP:
solicitud:
3. Programación de red Java basada en sockets
1. ¿Qué es el socket?
Dos programas en la red realizan el intercambio de datos a través de una conexión de comunicación bidireccional. Un extremo de este enlace bidireccional se llama enchufe. Socket generalmente se usa para conectarse entre clientes y proveedores de servicios. Socket es una interfaz de programación muy popular del protocolo TCP/IP. Un socket está determinado de manera única mediante una dirección IP y un número de puerto.
Sin embargo, los tipos de protocolos compatibles con el socket no solo son TCP/IP, por lo que no existe una conexión necesaria entre los dos. En el entorno Java, la programación de socket se refiere principalmente a la programación de red basada en el protocolo TCP/IP.
2. El proceso de comunicación de socket
El lado del servidor escucha (escucha) si hay una solicitud de conexión en un puerto determinado. El lado del cliente emite una solicitud de conexión al lado del servidor, y el lado del servidor envía un mensaje de aceptación al lado del cliente. Se establece una conexión. Tanto el servidor como el lado del cliente pueden comunicarse entre sí a través de envío, escritura y otros métodos.
Para un socket completamente funcional, debe incluir la siguiente estructura básica, y su proceso de trabajo incluye los siguientes cuatro pasos básicos:
(1) crear socket;
(2) Abra la entrada/flujo de salida conectado al enchufe;
(3) leer/escribir el socket de acuerdo con un cierto protocolo;
(4) Cerrar el enchufe. (En las aplicaciones reales, el cierre mostrado no se usa. Aunque muchos artículos recomiendan esto, en mi programa, puede no tener ningún impacto porque el programa en sí es relativamente simple y tiene bajos requisitos).
3. Crear enchufe
Socket (dirección ineTaddress, puerto int); Socket (dirección inetaddress, int puerto, transmisión booleana); Socket (host de cadena, int prot); Socket (host de cadena, int prot, transmisión booleana); Socket (SocketImpl impl) Socket (Host String Host, Int Port, Inetaddress LocalAddr, int localport) Socket (dirección inetaddress, int Port, inetaddress localaddr, int localport) ServerSocket (int puerto); ServerSocket (int Port, int Backlog); ServerSocket (int Port, int Backlog, inetAddress bindAddr) donde la dirección, el host y el puerto son la dirección IP, el nombre del host y el número de puerto de la otra parte en la conexión bidireccional respectivamente. La transmisión indica si el socket es un socket de transmisión o un socket de datagrama. Localport indica que el número de puerto del host local, LocalAdDR y BindAdDR son la dirección de la máquina local (la dirección del host del ServerSketsock). Impl es la clase principal del socket, que se puede usar para crear servidores y crear enchufes. El recuento representa el número máximo de conexiones que el servidor puede admitir. Por ejemplo: Learning Video Network http://www.xxspw.com Socket Client = new Socket ("127.0.01.", 80); Serversocket Server = nuevo Serversocket (80);Tenga en cuenta que debe tener cuidado al seleccionar un puerto. Cada puerto proporciona un servicio específico. Solo dando el puerto correcto se puede obtener el servicio correspondiente. Los números de puerto de 0 ~ 1023 están reservados por el sistema. Por ejemplo, el número de puerto del servicio HTTP es 80, el número de puerto del servicio Telnet es 21 y el número de puerto del servicio FTP es 23. Por lo tanto, cuando seleccionamos el número de puerto, es mejor elegir un número mayor que 1023 para evitar conflictos.
Si se produce un error al crear un socket, se generará una IOException y debe procesarse en el programa. Entonces, al crear socket o ServerSocket, se deben atrapar o arrojar excepciones.
4. Programa simple de cliente/servidor
1. Programa del cliente
import java.io.*; import java.net.*; Public Class TalkClient {public static void main (string args []) {try {socket socket = new Socket ("127.0.0.1", 4700); // Enviar una solicitud de cliente al puerto 4700 de la máquina BufferedReader sen = new BufferedReader (new InputStreamReader (System.in)); // Construye el objeto BufferedReader a partir del dispositivo de entrada estándar del sistema PrintWriter OS = new PrintWriter (Socket.getOutputStream ()); // Obtenga la transmisión de salida del objeto Socket y construya el objeto PrintWriter BufferedReader es = nuevo BufferedReader (nuevo InputStreamReader (Socket.GetInputStream ())); // Obtenga la secuencia de entrada del objeto Socket y construya la línea de lectura del objeto BufferedReader correspondiente; readline = sin.readline (); // Leer una cadena de la entrada estándar del sistema mientras (! Readline.equals ("Bye")) {// Si la cadena leída de la entrada estándar es "Bye", detenga el bucle OS.println (readline); // emite la cadena leída de la entrada estándar del sistema al servidor os.flush (); // Actualizar la transmisión de salida para que el servidor reciba inmediatamente el string System.out.println ("Cliente:"+Readline); // imprima la cadena de lectura System.out.println ("Server:"+IS.Readline ()); // leer una cadena desde el servidor e imprima a la salida estándar readline = sin.readline (); // Leer una cadena de la entrada estándar del sistema} // Continuar en bucle OS.Close (); // Cerrar la transmisión de salida de socket es.close (); // Cerrar el flujo de entrada de socket Socket.close (); // Cerrar socket} Catch (Exception e) {System.out.println ("Error"+E); // ocurre un error, se imprime un mensaje de error}}}2. Programa del lado del servidor
import java.io.*; import java.net.*; import java.applet.applet; public class talkServer {public static void main (string args []) {try {ServerSocket Server = null; intente {servidor = new ServerSocket (4700); // Cree un ServerSocket para escuchar las solicitudes de los clientes en el puerto 4700} Catch (Exception E) {System.out.println ("No puede escuchar:"+E); // Error, imprima el mensaje de error} socket socket = null; intente {Socket = Server.accept (); // Use Acepter () para bloquear y esperar la solicitud del cliente. Si un cliente // después de que llegue la solicitud, se genera un objeto Socket y continúe ejecutando} Catch (Exception e) {System.out.println ("Error".+E); // Se produce un error, la información de error de impresión se imprime} línea de cadena; BufferedReader es = nuevo BufferedReader (nuevo InputStreamReader (Socket.getInputStream ())); // Obtenga el flujo de entrada del objeto Socket y construya el objeto BufferedReader correspondiente PrintWriter OS = NewPrintWriter (Socket.getOutputStream ()); // Obtener la secuencia de salida del objeto Socket y construir el objeto PrintWriter BufferedReader sin = new BufferedReader (new InputStreamReader (System.in)); // Construye el objeto BufferedReader System.out.println ("Client:"+IS.ReadLine ()); // imprima la cadena leída del cliente en la línea de salida estándar = sen.readline (); // lee una cadena de la entrada estándar while (! Line.equals ("bye")) {// Si la cadena es "adiós", detenga el bucle os.println (línea); // emitir la cadena OS.Flush () al cliente; // Actualizar la transmisión de salida para que el cliente reciba inmediatamente el String System.out.println ("Server:"+Line); // imprime la cadena de lectura System.out.println ("Client:"+IS.Readline ()); // leer una cadena del cliente e imprima en la línea de salida estándar = sin.readline (); // Leer una cadena de la entrada estándar del sistema} // Continuar en bucle OS.Close (); // Cerrar la transmisión de salida de socket es.close (); // Cerrar el flujo de entrada de socket Socket.close (); // Cerrar Socket Server.Close (); // Cerrar Serversocket} Catch (Exception E) {System.out.println ("Error:"+E); // ocurrió un error, imprima el mensaje de error}}}5. Soporte del programa de cliente/servidor de clima múltiple
El programa de cliente/servidor anterior solo puede implementar conversaciones entre el servidor y un cliente. En aplicaciones reales, a menudo se ejecuta un programa permanente en el servidor, que puede recibir solicitudes de otros clientes y proporcionar servicios correspondientes. Para realizar la función de proporcionar servicios a múltiples clientes en el servidor, el programa anterior debe transformarse y se implementa el mecanismo de múltiples subprocesos. El servidor siempre escucha si hay solicitudes de clientes en el puerto especificado. Una vez que se escucha la solicitud del cliente, el servidor iniciará un hilo de servicio especial para responder a la solicitud del cliente. El servidor en sí ingresa inmediatamente al estado de escucha después de comenzar el hilo, esperando que llegue el próximo cliente.