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

package test.core.nio;import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.net.InetSocketAddress;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.math.NumberUtils;
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;/*** @author xfyou* @date 2019/3/21*/
@Slf4j
public class AsyncSocket {private final ClientBootstrap clientBootstrap;private final InetSocketAddress address;private int timeout;private static final byte CONNECTORS_POOL_SIZE = 1;private static final byte WORKERS_POOL_SIZE = 30;public AsyncSocket(String hostIp, String port, int timeout, String name) {final ThreadFactory threadFactory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat(name + "-pool-%d").setPriority(Thread.NORM_PRIORITY).build();final ExecutorService connectors = new ThreadPoolExecutor(CONNECTORS_POOL_SIZE, CONNECTORS_POOL_SIZE, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);final ExecutorService workers = new ThreadPoolExecutor(WORKERS_POOL_SIZE, WORKERS_POOL_SIZE, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);clientBootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(connectors, workers, CONNECTORS_POOL_SIZE, WORKERS_POOL_SIZE));address = new InetSocketAddress(hostIp, NumberUtils.toInt(port));clientBootstrap.setOption("remoteAddress", address);clientBootstrap.setOption("connectTimeoutMillis", timeout);this.timeout = timeout;addShutdownHook();}@SneakyThrowspublic byte[] send(final byte[] data) {final SocketEventHandler socketEventHandler = new SocketEventHandler(timeout);final Channel channel = clientBootstrap.getFactory().newChannel(Channels.pipeline(socketEventHandler));final ChannelFuture future = channel.connect(address);future.addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture future) throws Exception {if (future.isSuccess()) {channel.write(ChannelBuffers.wrappedBuffer(data));} else {log.error("I/O operation has failed.", future.getCause());throw (Exception) future.getCause();}}});return socketEventHandler.getMessage();}private void addShutdownHook() {Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {clientBootstrap.releaseExternalResources();}});}private class SocketEventHandler extends SimpleChannelUpstreamHandler {private byte[] message;private int timeout;private final CountDownLatch latch = new CountDownLatch(1);SocketEventHandler(int timeout) {this.timeout = timeout;}@SneakyThrowsbyte[] getMessage() {latch.await(timeout, TimeUnit.MILLISECONDS);return message;}@Overridepublic void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {if (null != e.getMessage()) {message = ((ChannelBuffer) e.getMessage()).array();latch.countDown();}if (null != ctx.getChannel()) {ctx.getChannel().close();}}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {if (null != ctx.getChannel()) {ctx.getChannel().close();}log.error("An exception was raised by an I/O thread.", e.getCause());}}}

转载于:https://www.cnblogs.com/frankyou/p/10593279.html

Netty实现的一个异步Socket代码相关推荐

  1. c#异步socket

    .NET Socket开发之异步Socket 在基于.NET的网络服务端的开发中,我们用到和听到的最多的恐怕就是异步Socket了.异步Socket的性能比同步高出很多,但是编写代码比较复杂.因此异步 ...

  2. [翻译]深入理解Tornado——一个异步web服务器

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

  3. 高并发 python socket send 异步_在Python中使用异步Socket编程性能测试

    ok,首先写一个python socket的server段,对开放三个端口:10000,10001,10002.krondo的例子中是每个server绑定一个端口,测试的时候需要分别开3个shell, ...

  4. [python3.3]Python异步Socket编程【TCP】

    参考: http://www.cnblogs.com/snailrun/p/3805188.html 异步网络据说能极大的提高网络server的连接速度,所以打算写一个专题,来学习和了解异步网络.因为 ...

  5. C#.net同步异步SOCKET通讯和多线程总结(转)

    C#.net同步异步SOCKET通讯和多线程总结 来源:http://www.cnblogs.com/Silverlight_Team/archive/2009/03/13/1411136.html ...

  6. Netty框架多人聊天案例,代码示例

    Netty框架多人聊天案例,代码示例 pom <?xml version="1.0" encoding="UTF-8"?> <project ...

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

    本文原创版权归 CSDN hulihui 所有,转载请按照如下方式显示标明原创作者及出处,以示尊重!! 作者: hulihui 原文:http://blog.csdn.net/hulihui/arch ...

  8. 同步和异步Socket多线程编程基本模型介绍

    多线程:  0.  多线程的概念:  多线程是这样一种机制,它允许在程序中并发执行多个线程,且每个线程彼此间互相独立.  并发的理解:  多个线程的执行是并发的,也就是在逻辑上"同时&quo ...

  9. 游戏客户端与服务器通讯协议,Jtro的技术分享:游戏客户端与服务器(c#)通讯_异步Socket...

    首先跟大家道个歉,上一个同步Socket文章里用的不是Markdown编写的,所以代码看起来不是很清爽,我用的鹅厂的浏览器,终于发现是浏览器的锅,图片拖不上去 -_-|| , 真的是很失败啊,现在好了 ...

最新文章

  1. java实现鼠标宏编程_我應該如何編程高級java遊戲中的鼠標/鍵輸入?
  2. TurboMail邮件系统实用技巧十四:如何知道对方已经读信
  3. 下载文章图片 php,PHP下载文章中的图片+处理文章中的字符
  4. 吉林省统考计算机英语作文,2019年吉林省学位英语作文必背范文(我最……的题材) - 希赛网...
  5. 流量计算机标准,流量计算机
  6. pip install mysql-connector 安装出错
  7. 32linux下安装mysql5.7_Linux系统下以RPM方式安装mysql-5.7.9
  8. OJ1050: 阶乘的累加和(C语言实现多重循环和递推方法)
  9. php使用curl发送请求时 添加header失效
  10. 一文带你了解数仓智能运维框架
  11. 《DNS与BIND(第5版)》——第10章 高级功能10.1 地址匹配列表和ACL
  12. Android 微信支付
  13. Modbus-RTU入门篇
  14. 怎样邀请别人加入企业微信?
  15. linux 修改文件的权限
  16. 用python的turtle画分形树
  17. Arch Linux上使用 pandoc 将 markdown 转为 pdf 以及如何查看本机的中文字体 fc-list :lang=zh
  18. 综合布线包括计算机网络,综合布线试题
  19. linux下修改ext3硬盘为nst,Linux服务器数据备份恢复策略(3)
  20. MyBatis一级缓存和二级缓存

热门文章

  1. 2016年中国国际信息通信展览会在北京开幕
  2. 如何使用Orchard搭建敏捷个人的网站(1)
  3. POJ 3621 Sightseeing Cows [最优比率环]
  4. 转 从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例
  5. Android SDK Manager下载详解
  6. 主题:Hibernate/Spring/Struts架构使用OpenSessionInView的问题
  7. Excel(16)-好学实用的Index!
  8. spark任务shell运行_Spark原理与实战(七)部署模式与运行机制
  9. java web环境配置_JAVA Web开发环境配置
  10. java量_Java 2. 量与常量