java网络编程

java网络编程

BIO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
psvm{
ServerSocket ss = new ServerSocket();
ss.bind(new InetSocketAddress("127.0.0.1"),8888);
while(true){
Socket s = ss.accept();
new Thread(() ->{
heandle(s);
}).start();
}
}
static void handle(Socket s){
try{
byte[] bytes = new byte[1024];
int len = s.getInputStream().read(bytes);

s.getOutputStream().write(bytes,0,len);
}catch {bala}
}
graph RL
    ss --bind --> s
        subgraph server
            s(s:127.0.0.1:8888)
        end
        subgraph listen
            s --accept--> thread1
            s --accept--> thread2 
            s --accept-->thread3
        end

BIO会出现的问题

  • ss.accept()内的线程会
  • read
  • write

解决方案:轮询

  1. NIO-single Thread(NewNon-Blocking)

    说明:大管家selector轮询:如果有客户端连接,就处理(单线程)压力很大

    1564315140781

  2. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    psvm{
    ServerSocketChannel ssc = .open();
    ssc.socket().bind (~~~);
    ssc.configureBlocking(false);
    Selector selector = Selector.open();
    ssc.register(selector ,~);
    while(true){
    selector.select(); //轮询选择到的请求 -> 也是阻塞
    Set<SelectionKey> key -> selector.selectedKeys(); //事件发生 把当前事件设个key
    //遍历SelectinKey 把得到的key remove
    handle(key)
    }
    }
    void handle(){
    ServerSocketChannel ssc = key.channel();
    SocketChannel sc = ssc.accept();
    //阻塞 -> false
    sc.register( //设一个key)

    }
graph RL 
    boy(大管家) --注册--> accept1
    boy(大管家) --注册--> accept2
    subgraph list
        key_one 
        key_two 
    end

    subgraph 插座
        accept1 --register--- key_one
        accept2 --register--- key_two  
        等待

    end

AIO

实现了异步非阻塞IO

AIO取消了对Selector注册通道的轮询

采用hock函数将read 、write 、accept 3个不同模块分别交付给os操作。

0%