本人写的一个使用Netty实现的一个异步Socket代码

  1. package test.core.nio;
  2.  
  3. import com.google.common.util.concurrent.ThreadFactoryBuilder;
  4. import java.net.InetSocketAddress;
  5. import java.util.concurrent.CountDownLatch;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.LinkedBlockingQueue;
  8. import java.util.concurrent.ThreadFactory;
  9. import java.util.concurrent.ThreadPoolExecutor;
  10. import java.util.concurrent.TimeUnit;
  11. import lombok.SneakyThrows;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.apache.commons.lang3.math.NumberUtils;
  14. import org.jboss.netty.bootstrap.ClientBootstrap;
  15. import org.jboss.netty.buffer.ChannelBuffer;
  16. import org.jboss.netty.buffer.ChannelBuffers;
  17. import org.jboss.netty.channel.Channel;
  18. import org.jboss.netty.channel.ChannelFuture;
  19. import org.jboss.netty.channel.ChannelFutureListener;
  20. import org.jboss.netty.channel.ChannelHandlerContext;
  21. import org.jboss.netty.channel.Channels;
  22. import org.jboss.netty.channel.ExceptionEvent;
  23. import org.jboss.netty.channel.MessageEvent;
  24. import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
  25. import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
  26.  
  27. /**
  28. * @author xfyou
  29. * @date 2019/3/21
  30. */
  31. @Slf4j
  32. public class AsyncSocket {
  33.  
  34. private final ClientBootstrap clientBootstrap;
  35.  
  36. private final InetSocketAddress address;
  37.  
  38. private int timeout;
  39.  
  40. private static final byte CONNECTORS_POOL_SIZE = 1;
  41.  
  42. private static final byte WORKERS_POOL_SIZE = 30;
  43.  
  44. public AsyncSocket(String hostIp, String port, int timeout, String name) {
  45. final ThreadFactory threadFactory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat(name + "-pool-%d").setPriority(Thread.NORM_PRIORITY).build();
  46. final ExecutorService connectors = new ThreadPoolExecutor(CONNECTORS_POOL_SIZE, CONNECTORS_POOL_SIZE, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);
  47. final ExecutorService workers = new ThreadPoolExecutor(WORKERS_POOL_SIZE, WORKERS_POOL_SIZE, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);
  48. clientBootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(connectors, workers, CONNECTORS_POOL_SIZE, WORKERS_POOL_SIZE));
  49. address = new InetSocketAddress(hostIp, NumberUtils.toInt(port));
  50. clientBootstrap.setOption("remoteAddress", address);
  51. clientBootstrap.setOption("connectTimeoutMillis", timeout);
  52. this.timeout = timeout;
  53. addShutdownHook();
  54. }
  55.  
  56. @SneakyThrows
  57. public byte[] send(final byte[] data) {
  58. final SocketEventHandler socketEventHandler = new SocketEventHandler(timeout);
  59. final Channel channel = clientBootstrap.getFactory().newChannel(Channels.pipeline(socketEventHandler));
  60. final ChannelFuture future = channel.connect(address);
  61. future.addListener(new ChannelFutureListener() {
  62. @Override
  63. public void operationComplete(ChannelFuture future) throws Exception {
  64. if (future.isSuccess()) {
  65. channel.write(ChannelBuffers.wrappedBuffer(data));
  66. } else {
  67. log.error("I/O operation has failed.", future.getCause());
  68. throw (Exception) future.getCause();
  69. }
  70. }
  71. });
  72. return socketEventHandler.getMessage();
  73. }
  74.  
  75. private void addShutdownHook() {
  76. Runtime.getRuntime().addShutdownHook(new Thread() {
  77. @Override
  78. public void run() {
  79. clientBootstrap.releaseExternalResources();
  80. }
  81. });
  82. }
  83.  
  84. private class SocketEventHandler extends SimpleChannelUpstreamHandler {
  85.  
  86. private byte[] message;
  87.  
  88. private int timeout;
  89.  
  90. private final CountDownLatch latch = new CountDownLatch(1);
  91.  
  92. SocketEventHandler(int timeout) {
  93. this.timeout = timeout;
  94. }
  95.  
  96. @SneakyThrows
  97. byte[] getMessage() {
  98. latch.await(timeout, TimeUnit.MILLISECONDS);
  99. return message;
  100. }
  101.  
  102. @Override
  103. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
  104. if (null != e.getMessage()) {
  105. message = ((ChannelBuffer) e.getMessage()).array();
  106. latch.countDown();
  107. }
  108. if (null != ctx.getChannel()) {
  109. ctx.getChannel().close();
  110. }
  111. }
  112.  
  113. @Override
  114. public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
  115. if (null != ctx.getChannel()) {
  116. ctx.getChannel().close();
  117. }
  118. log.error("An exception was raised by an I/O thread.", e.getCause());
  119. }
  120.  
  121. }
  122.  
  123. }

Netty实现的一个异步Socket代码的更多相关文章

  1. Netty接收到一个请求但是代码段执行了两次

    这是因为HttpRequestDecoder把请求拆分成HttpRequest和HttpContent两部分, 所以在建立连接的时候建立了两次.

  2. 一个高性能异步socket封装库的实现思路 (c#)

    前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...

  3. ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)

    ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用! 因此,ES tra ...

  4. Netty(1):第一个netty程序

    为什么选择Netty netty是业界最流行的NIO框架之一,它的健壮型,功能,性能,可定制性和可扩展性都是首屈一指的,Hadoop的RPC框架Avro就使用了netty作为底层的通信框架,此外net ...

  5. 简单的异步Socket实现——SimpleSocket_V1.1

    简单的异步Socket实现——SimpleSocket_V1.1 笔者在前段时间的博客中分享了一段简单的异步.net的Socket实现.由于是笔者自己测试使用的.写的很粗糙.很简陋.于是花了点时间自己 ...

  6. Python简易聊天工具-基于异步Socket通信

    继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...

  7. 项目笔记---C#异步Socket示例

    概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域,或者被合并或者仍然应用于某 ...

  8. 深入理解Tornado——一个异步web服务器

    本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...

  9. 可扩展多线程异步Socket服务器框架EMTASS 2.0 续

    转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...

随机推荐

  1. day 61 Django part-1 django的安装,以及初学者三件套(以及settings中的mysql配置)

    我们的django到底是什么东西呢? 我们的代码都是在后台写的,包括我们的pycharm都是属于后台的工具,但是我们的后端开发说到底是需要开发完了之后拿到用户面前的,让我们的用户看到我们的东西,首先要 ...

  2. AspectJ(AOP)切面获取参数名称和参数

    @Async @AfterReturning(value ="execution(public * com.zhx.recharge.service.RechargeService.buil ...

  3. 初窥Java之一

    一.常用的dos命令 打开命令提示符窗口的方式: ① win + R --> 输入cmd --> 回车 ② 开始 --> 搜索程序和文件的框中输入  cmd  --> 回车 ③ ...

  4. Spark-Unit2-Spark交互式命令行与SparkWordCount

    一.Spark交互式命令行 启动脚本:spark-shell 先启动spark:./start-all.sh 本地模式启动命令:/bin/spark-shell 集群模式启动命令:/bin/spark ...

  5. POJ 2299 Ultra-QuickSort (离散化)+【树状数组】

    <题目链接> 题目大意: 给你一段序列,问你如果每次只交换该序列相邻的两个元素,最少需要交换多少步才能够使该序列变为升序排列. 解题分析: 不难发现,其实本题就是让我们求原始序列的逆序对, ...

  6. 003.Ansible基础使用

    一 Ansible命令用法 Ansible命令行执行方式有:Ad-Hoc.Ansible-playbook两种,Web方式其官方提供付费产品Tower.Ad-Hoc主要用于临时命令的执行,Ansibl ...

  7. webpack 4.x之搭建前端开发环境

    webpack是一个现代JavaScript应用程序的静态模块打包器,借用官网的一张图,它能够将一些预处理语言,js的最新语法转换成浏览器识别的内容.现在一般的前端框架都有比较成熟的脚手架,大多数对w ...

  8. javascript的严格模式和正常模式

    在js代码中加入"use strict";就相当于进入严格模式,严格模式改变了语法和运行时行为,将隐藏的问题转化为错误. js的严格模式有以下特点: 一.变量声明 全局变量必须显示 ...

  9. React Native升级目标SDK

    React Native升级目标SDK 打开在 android/app/的build.gradle 找到 android { } 区块 改变以下属性 compileSdkVersion 26 buil ...

  10. Java 接口 Cloneable

    Cloneable接口的目的是作为对象的一个mixin接口,表明这样的对象允许克隆.如果一个类实现了Cloneable接口,Object的clone方法就返回该对象的逐域拷贝,相当于无需调用构造器就可 ...