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应用层去内核态读取*