如何利用CountDownLatch实现基于netty的BIO

发布时间:2021-12-14 17:03:38 作者:柒染
来源:亿速云 阅读:202

今天就跟大家聊聊有关如何利用CountDownLatch实现基于netty的BIO,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Netty是一个NIO客户端-服务器框架,在NIO模式下,线程直接返回结果,当缓冲区准备好数据之后再异步线程回调客户端消息处理。不会像BIO一样阻塞线程(I/O)并持续等待被调用方准备好响应数据才返回。

但是在某些使用socket通讯的场景下,使用了NIO的netty,但是调用方必须在当前线程等待服务返回业务处理状态之后才能进行后续的操作,那么就需要用到BIO模式,那么除了使用java原生的BIO,这里介绍一种使用CountDownLatch+Netty来模拟BIO的实现。

下面介绍下实现过程和伪代码,文章末尾提供完整示例下载地址。代码仅供学习。

 /*** 发送消息* @param msg*/public void sendMsg(String ip,int port,String msg) {  try {     //1 连接到服务端,如果长连接可以修改此逻辑    connectToServer(ip, port);    //2生成阻塞计数器    String sn = UUID.randomUUID().toString();    Receiver.addWait(sn);     //3 发送数据    client.channel().writeAndFlush(sn+"@"+msg+"END").sync();//加end防止粘包    LOG.info("发送消息成功,msg:"+msg);     //4 等待接接收到消息后,计数器countdown。    Receiver.block(sn);//可以设置等待时间,以防止线程长时间阻塞。    //5处理服务端返回    handlerServerAnswer(sn);     } catch (Exception e) {      LOG.error("处理消息失败.",e);    }}
/**  * 处理服务端返回消息 */@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {   try {     String dataFromServer = (String) msg;     String[] snData = dataFromServer.split("@");     String sn = snData[0];     String data = snData[1];     response.put(sn, data);//等待业务逻辑消费     if(!waitLatch.containsKey(sn)) {       LOG.error("非法sn:"+sn);       return;     }     waitLatch.get(sn).countDown();//取消阻塞,让发送线程后续逻辑运行。     waitLatch.remove(sn);    } catch (Exception e) {      LOG.error("接收到非法数据:"+msg);    } }
/*** 模拟服务端* @param args* @throws Exception*/public static void main( String[] args ) throws Exception  {     serverSocket = new ServerSocket(PORT);     LOG.info("服务监听启动,端口:"+PORT);     while(true) {       try {        Socket socket = serverSocket.accept();        InputStream in = socket.getInputStream();        int len;        StringBuffer sb = new StringBuffer();        byte[] bytes = new byte[1024];        while((len = in.read(bytes))!=-1) {          String bytesData = new String(bytes,0,len,"utf-8");          sb.append(bytesData);          if(bytesData.endsWith("END")) {            //处理业务逻辑并返回消息            handMsgAndResponse(socket,sb.toString());            sb = null;          }        }      } catch (Exception e) {        LOG.error("处理客户端消息失败.",e);      }          Thread.sleep(1000);        }  }

看完上述内容,你们对如何利用CountDownLatch实现基于netty的BIO有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. netty系列之Java BIO NIO AIO进化史
  2. 如何利用Java搭建个简单的Netty通信

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

countdownlatch netty bio

上一篇:Markdown编辑器有哪些

下一篇:如何修改Markdown神器Typora的主题样式

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》