NIO y Netty-2-BIO transformar sin bloqueo

NIO y Netty-2-BIO transformar sin bloqueo

  • Debido BIO está bloqueando IO, caso hilo de un solo subproceso controlador puede bloquear en el que acepta un enchufe de conexión de lectura o socket servicio, sólo puede ser un hilo de procesamiento para cada socket, todo nuevo sus datos leídos.

  • transformación BIO de la ex modelo

    • Un hilo de escucha, cómo existen muchas conexiones sobre el número de roscas de conexión. Un hilo corresponde a una toma de corriente.
    • Aquí Insertar imagen Descripción
  • El uso del retorno de tiempo de espera para transformar

    • Debido a que el Accpet ServerSocket leer y conexión de socket con una función de retorno de tiempo de espera se puede realizar usando esta (pseudo) no bloqueante transformación.

    • Ideas actualización

      • Utilizar sólo un hilo, juego al crear ServerSocket y zócalo en un corto tiempo de espera , por lo que los datos originales hay obstrucción puede aceptar y leer tope de bloqueo agotado durante un tiempo muerto.

      • Luego, en un bucle sin fin Accpet primero tratar de conseguir una conexión, tratar de establecer una conexión a ir uno por uno para ser operaciones de lectura.

      • Aquí Insertar imagen Descripción

      • Después de la transformación del servidor

        • public static void main(String[] args) throws Exception {
              byte[] msg=new byte[1024];//存储收到信息用的数组
          	//存储建立好的连接和其输入流的map
              Map<Socket,InputStream> map=new HashMap<>();
              //建立serversocket,并设置超时时间,防止一直阻塞
              ServerSocket serverSocket = new ServerSocket(6666);
              serverSocket.setSoTimeout(1);
              System.out.println("服务器启动了");
              while (true) {//一直轮询
                  try{
                      //accept若超时未获得新连接会抛出异常
                      Socket socket = serverSocket.accept();
                      System.out.println("连接到一个客户端");
                      socket.setSoTimeout(1);//设置超时时间
                      map.put(socket,socket.getInputStream());
                  }catch (SocketTimeoutException e){
                      //捕获超时异常不处理
                  }
                  //将当前map的key拷贝下来
                  Set<Socket> clientSockets = new HashSet<>(map.keySet());
                  for(Socket socket1:clientSockets){//遍历已经建立的连接
                      try{
                          //read若超时未读到信息则抛出异常
                          int i = map.get(socket1).read(msg);
                          if(i>0){//存在信息则
                              System.out.println("收到信息:"+
                                                 new String(msg).substring(0,i));
                          }else {
                              map.get(socket1).close();
                              socket1.close();
                              map.remove(socket1);
                          }
                      }catch (SocketTimeoutException e){}
                      catch (SocketException e){
                          map.get(socket1).close();
                          socket1.close();
                          map.remove(socket1);
                      }
                  }
              }
          }
        • Nuestro servidor en este momento sólo un hilo, que puede manejar toma de corriente múltiple.

Publicado 27 artículos originales · ganado elogios 1 · visitas 894

Supongo que te gusta

Origin blog.csdn.net/hu853996234/article/details/104253687
Recomendado
Clasificación