TCPIP + BIO

De: https://www.xuebuyuan.com/3215262.html

En Java, la comunicación entre sistemas TCP / IP + BIO se puede realizar en base a Socket y ServerSocket. Socket se usa principalmente para realizar la operación de establecer una conexión y una red IO, y ServerSocket se usa principalmente para realizar el monitoreo del puerto del servidor y la adquisición del objeto Socket.

Los códigos clave de Socket para realizar el cliente son los siguientes:

/ * Crear una conexión. Si no se puede resolver el nombre de dominio, se generará una excepción UnkownHostException y se generará una IOException cuando no se pueda alcanzar la conexión.

       * Si desea controlar el tiempo de espera para establecer una conexión, primero puede llamar al método socket = newSocket () y luego llamar al método socket.connect (punto final SocketAddress, tiempo de espera int)

       * /

       Socket socket =  nuevo  Socket ("www.baidu.com", 80);

       / * Cuando esta opción se establece en un valor de tiempo de espera distinto de cero, al invocar read () en InputStream asociado con este socket solo se bloqueará durante este período de tiempo.

        * Si se excede el valor del tiempo de espera, se lanzará java.net.SocketTimeoutException, aunque el Socket sigue siendo válido.

        * La opción debe estar habilitada antes de ingresar a la operación de bloqueo para que surta efecto.

        * El valor del tiempo de espera debe ser un número> 0. Un valor de tiempo de espera de 0 se interpreta como un valor de tiempo de espera infinito.

        * /

       socket.setSoTimeout ( WAIT_TIME ); // En la operación de lectura, se lanza SocketTimeoutException después de 5 segundos

       Sistema. out .println ("socketcreated!");

       prueba  {

           // Obtener la secuencia de retorno del lado del servidor

           InputStreamips = socket.getInputStream ();

           BufferedReader bin = nuevo  BufferedReader ( nuevo  InputStreamReader (ips));

           // Crea un PrintWriter que escribe una secuencia en el servidor

           Sistema. out .println ("inputstream getted:" + bin);

           PrintWriter out = nuevo  PrintWriter (socket.getOutputStream ());

           // Enviar la información de la cadena al servidor. Cabe señalar que incluso si la escritura falla esta vez, no se generará ninguna información de excepción.

           // Y se bloqueará hasta que la escritura en el sistema operativo o la red IO sea anormal.

           out.print ("hola");

           // Bloquea la lectura de la información de retorno del servidor, el programa se bloquea hasta que el servidor devuelve información o aparece la red IO

           // Hasta la excepción, si desea detener el bloqueo después de más de un período de tiempo, debe crear un objeto Socket

           // Después de llamar a socket.setSoTimeout (int timeout)

           prueba {

           Cadena  inputline = bin.readLine ();

           } catch  (SocketTimeoutException e) {

              Sistema. out .println (e.getMessage () + "; el tiempo de espera es:" + WAIT_TIME );

           }

       }  finalmente  {

           socket.close ();

       }

       Sistema. out .println ("terminado");

Los códigos clave en el lado del servidor son los siguientes:

// Cree un servidor para monitorear el puerto local especificado, si un conflicto de puerto genera SocketException,

       // Otras excepciones de IO de red lanzan IOException

       ServerSocket s =  nuevo  ServerSocket ( LISTENING_PORT );

       // Acepte la solicitud del cliente para establecer una conexión y devolver un objeto Socket para interactuar con el cliente

       // El modo interactivo es el mismo que el cliente, a través de getInputStream () y getOutputStream ()

       // Para leer y escribir.

       // Este método se bloqueará hasta que un cliente envíe una solicitud para establecer una conexión. Si desea limitar el tiempo de bloqueo, puede

       // Establezca el tiempo de espera llamando a setSoTimeout (int timeout). Se lanzará después del tiempo especificado

       //s.setSoTimeout(WAIT_TIME);

       Socket entrante = s.accept (); // Esperando conexión del cliente

       if  (entrante.isConectado ()) {

           log .info ("creat aconnect");

       }

En el código anterior, se puede establecer una comunicación simple entre sistemas basada en Socket y Server. En un sistema real, generalmente el cliente tiene que enviar múltiples solicitudes al servidor al mismo tiempo, y el servidor tiene que aceptar las solicitudes enviadas por varias conexiones al mismo tiempo.

Para asegurarse de que el cliente puede enviar múltiples solicitudes al servidor al mismo tiempo, la forma más sencilla es generar múltiples sockets. Pero luego hay dos problemas:

1. Demasiados sockets consumirán demasiados recursos locales: en el caso de demasiadas máquinas cliente y muy pocas máquinas de servidor, demasiados sockets harán que el servidor admita una gran cantidad de conexiones;

2. La generación de socket (establecimiento de conexión) suele ser lenta, por lo que la creación frecuente causará un rendimiento insuficiente del sistema.

En vista de esto, generalmente es mejor usar el grupo de conexiones para mantener los Sockets. Al hacerlo, la cantidad de Sockets que se pueden crear puede limitarse primero. En segundo lugar, al colocar el Socket en el grupo de conexiones, se puede evitar la degradación del rendimiento causada por la creación repetida del Socket. Por ejemplo, el grupo de conexión de la base de datos es un ejemplo típico. Sin embargo, el uso de la agrupación de conexiones también tiene desventajas. El número de sockets en la agrupación de conexiones es limitado. Si hay muchas solicitudes de socket que se utilizarán al mismo tiempo, provocará una fuerte competencia y espera.

Además, una cuestión a la que se debe prestar atención es cómo controlar razonablemente el tiempo de espera para esperar una respuesta. Si no se establece el tiempo de espera, el cliente tendrá que esperar indefinidamente las solicitudes relevantes cuando el procesamiento saliente del servidor se ralentice, y los recursos del cliente pueden verse afectados. Es limitado, solo en este caso, es fácil causar problemas en el lado del servidor y el cliente cuelga. La configuración específica del tiempo de espera generalmente depende de la cantidad de solicitudes que el cliente puede soportar y el tiempo de procesamiento en el servidor. Java TCP / IP + BIO puede configurar fácilmente el tiempo de espera de bloqueo mediante el método setSoTimeout.

Para satisfacer la solicitud de que el servidor pueda aceptar múltiples conexiones al mismo tiempo, el método habitual es aceptar el Socket después de aceptar, poner el Socket en un hilo para su procesamiento, generalmente descrito como una conexión por hilo. De esta manera, el servidor puede aceptar múltiples conexiones para enviar solicitudes. La desventaja de este método es que no importa si hay una solicitud real en la conexión, consumirá un hilo. Para evitar crear demasiados hilos y agotar los recursos del lado del servidor, debe limitar el número de hilos creados. Por lo tanto, el número de conexiones simultáneas que el servidor puede admitir es limitado cuando se usa BIO.

Supongo que te gusta

Origin www.cnblogs.com/sharpest/p/12702757.html
Recomendado
Clasificación