linux内核实操演示java的BIO流程

BIO



public class ServerDemo {
    public static void main(String[] args) throws Exception {
        ThreadInfo[] threadInfos = ManagementFactory.getThreadMXBean().dumpAllThreads(false, false);
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println("[" + threadInfo.getThreadId() + "]" + threadInfo.getThreadName());
        }

        ServerSocket serverSocket = new ServerSocket(7777);
        while(true){
           // new Scanner(System.in).nextLine();
            Socket socket = serverSocket.accept();
            System.out.println(socket.getRemoteSocketAddress()+"上线了!");
            new Thread(()->{
                try{
                    InputStream is = socket.getInputStream();
                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                    String line ;
                    while((line = br.readLine())!=null){
                        System.out.println(socket.getRemoteSocketAddress()+":"+line);
                    }
                }catch (Exception e){
                    System.out.println(socket.getRemoteSocketAddress()+"下线了!");
                }
            }).start();
        }
    }
}

strace -ff -o ooxx /app/jdk8/bin/java ServerDemo
//追踪各个线程执行过程

socket(AF_INET6, SOCK_STREAM, IPPROTO_IP) = 5
//5表示引用绑定ServerSocket serverSocket
bind(5, {sa_family=AF_INET6, sin6_port=htons(7777), inet_pton(AF_INET6, “::”, &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, 28) = 0
//绑定7777
listen(5, 50)= 0
//监听
poll([{fd=5, events=POLLIN|POLLERR}], 1, -1
//阻塞

tail -f ooxx.3941 //追踪输出
nc localhost 7777 //连接

poll([{fd=5, events=POLLIN|POLLERR}], 1, -1) = 1 ([{fd=5, revents=POLLIN}])
accept(5, {sa_family=AF_INET6, sin6_port=htons(39046), inet_pton(AF_INET6, “::1”, &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, [28]) = 6
//连接成功,6表示socket

clone(child_stack=0x7fd3a953dfb0,flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fd3a953e9d0, tls=0x7fd3a953e700, child_tidptr=0x7fd3a953e9d0) = 5537
//clone创建线程,child_stack栈位置,堆共享

poll([{fd=5, events=POLLIN|POLLERR}], 1, -1
//又开始阻塞

recvfrom(6,
//查看ooxx.5537

tail -f ooxx.5537 //追踪
recvfrom(7, “kl\n”, 8192, 0, NULL, NULL) = 3
ioctl(7, FIONREAD, [0]) = 0
write(1, “/127.0.0.1:47236:kl”, 19) = 19
write(1, “\n”, 1) = 1
recvfrom(7,
//输出后又阻塞

在这里插入图片描述

	*new Socket("127.0.0.1",7777)
	时内核已经建立连接,但未分配程序ID号,
	accept即java应用层去内核态读取*

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值