400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

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

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

成都创新互联公司是一家专注网站建设、网络营销策划、小程序设计、电子商务建设、网络推广、移动互联开发、研究、服务为一体的技术型公司。公司成立十载以来,已经为上1000+成都橡塑保温各业的企业公司提供互联网服务。现在,服务的上1000+客户与我们一路同行,见证我们的成长;未来,我们一起分享成功的喜悦。

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有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


分享标题:如何利用CountDownLatch实现基于netty的BIO
转载注明:http://www.bluegullmedia.com/article/pccesh.html

其他资讯

让你的专属顾问为你服务

0.3253s