当前位置: 首页 > 后端技术 > Java

Netty1BIO模型介绍

时间:2023-04-01 16:41:01 Java

1总结本文主要讨论BIO模型下client和server是如何交互的;同时有个问题暂时没有办法解决,以后再解决。如果有人能给我一些建议,我将不胜感激。2原理BIO顾名思义,BlockIO;一旦数据没有准备好,就会阻塞;等待数据准备好再继续。因此,socket的连接、读写都会被阻塞。2.2优点在早期,这个模型也很有用。2.3缺点BIO模式下,为了增加服务端的并发,一个客户端请求往往开单线程,而不是占用服务端的主线程。即使在这种情况下,服务器的并发性也是捉襟见肘,因为一旦客户端不发送消息,服务器上的一个线程就会被阻塞而不是关闭;它还占用资源。3具体实现3.0代码实现逻辑客户端发送请求,服务端接收请求;服务器收到请求后,向客户端发送响应请求;这来回;3.1使用原生InputStream3.1.1Serverpublicstaticvoidmain(String[]args){try(ServerSocketserverSocket=newServerSocket(8899)){Socketaccept=serverSocket.accept();while(true){System.out.println("服务器收到客户端的请求地址:"+accept.getInetAddress());while(Objects.nonNull(accept)){System.out.println(111);InputStreamin=accept.getInputStream();byte[]bytes=newbyte[1024];整数长度=0;while((length=in.read(bytes))!=-1){System.out.println("来自客户端的消息:"+newString(bytes,0,length));}System.out.println("服务器读取消息结束");OutputStreamoutputStream=accept.getOutputStream();斯特里ngmsg="你好客户端,我来自服务器";outputStream.write(msg.getBytes(StandardCharsets.UTF_8));outputStream.flush();}}}catch(Exceptione){e.printStackTrace();}}3.1.2Clientpublicstaticvoidmain(String[]args){try(Socketsocket=newSocket("localhost",8899)){while(true){OutputStreamois=socket.getOutputStream();Stringhello="服务器你好,我来自客户端;";ois.write(hello.getBytes(StandardCharsets.UTF_8));ois.flush();System.out.println("客户端写入消息");线程.睡眠(666);InputStreaminputStream=socket.getInputStream();byte[]bytes=newbyte[1024];整数长度=0;while((length=inputStream.read(bytes))!=-1){System.out.println("来自服务器的消息:"+newString(bytes,0,length));}}}catch(Exceptione){e.printStackTrace();}}3.1.3结论这个解决方案会被阻塞;通过打印堆栈信息,可以看出卡在了socketRead0()方法中;也就是说,它在调用inputstream.read(bytes)时卡住了;即一直获取不到内容,所以一直卡在owner;使困惑?那应该通信几次就卡住了,而不是一启动就卡了?现在找到原因了但是我没有找到解决办法;猜测:当前client和server是不是共享同一个socket,只有一个写一个读?3.2将InputStream改为DataInputStream3.2.1Serverpublicstaticvoidmain(String[]args){try(ServerSocketserverSocket=newServerSocket(8899)){Socketaccept=serverSocket.accept();while(true){System.out.println("当前连接服务器的客户端地址:"+accept.getInetAddress());DataInputStreamdis=newDataInputStream(accept.getInputStream());StringclientMsg=dis.readUTF();System.out.println("来自客户端的消息:"+clientMsg);DataOutputStreamdos=newDataOutputStream(accept.getOutputStream());dos.writeUTF("你好客户端,我来自服务器,收到消息+"+clientMsg);}}catch(Exceptione){e.printStackTrace();}}3.2.2Clientpublicstaticvoidmain(String[]args){try(Socketsocket=newSocket("localhost",8899)){DataInputStreamdis=newDataInputStream(socket.getInputStream());DataOutputStreamdos=newDataOutputStream(socket.getOutputStream());while(true){Stringmsg="我来自客户端";dos.writeUTF(msg);Strings=dis.readUTF();System.out.println("msgfromserver:"+s);}}catch(Exceptione){e.printStackTrace();}}3.2.3否会有阻塞;很奇怪;双方的信息都打印的很顺利;3.3使用telnet作为客户端发送消息使用InputStream,如果没有消息,会卡在socketRead0();但是一旦telnet客户端输入内容,马上就往下走;但是使用DataInputStream会卡,telnet输入消息也会卡在socketRead0()方法中;3.4结论目前还没有结论,待解决

最新推荐
猜你喜欢