NIO y Netty-2-BIO transformar sin bloqueo
Directorio artículo
-
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.
-
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.
-
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.
-
-
-