Netty实现的一个异步Socket代码
本人写的一个使用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();
- }
- @SneakyThrows
- public 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() {
- @Override
- public 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() {
- @Override
- public 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;
- }
- @SneakyThrows
- byte[] getMessage() {
- latch.await(timeout, TimeUnit.MILLISECONDS);
- return message;
- }
- @Override
- public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
- if (null != e.getMessage()) {
- message = ((ChannelBuffer) e.getMessage()).array();
- latch.countDown();
- }
- if (null != ctx.getChannel()) {
- ctx.getChannel().close();
- }
- }
- @Override
- public 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());
- }
- }
- }
Netty实现的一个异步Socket代码的更多相关文章
- Netty接收到一个请求但是代码段执行了两次
这是因为HttpRequestDecoder把请求拆分成HttpRequest和HttpContent两部分, 所以在建立连接的时候建立了两次.
- 一个高性能异步socket封装库的实现思路 (c#)
前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...
- ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)
ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用! 因此,ES tra ...
- Netty(1):第一个netty程序
为什么选择Netty netty是业界最流行的NIO框架之一,它的健壮型,功能,性能,可定制性和可扩展性都是首屈一指的,Hadoop的RPC框架Avro就使用了netty作为底层的通信框架,此外net ...
- 简单的异步Socket实现——SimpleSocket_V1.1
简单的异步Socket实现——SimpleSocket_V1.1 笔者在前段时间的博客中分享了一段简单的异步.net的Socket实现.由于是笔者自己测试使用的.写的很粗糙.很简陋.于是花了点时间自己 ...
- Python简易聊天工具-基于异步Socket通信
继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...
- 项目笔记---C#异步Socket示例
概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域,或者被合并或者仍然应用于某 ...
- 深入理解Tornado——一个异步web服务器
本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...
- 可扩展多线程异步Socket服务器框架EMTASS 2.0 续
转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...
随机推荐
- day 61 Django part-1 django的安装,以及初学者三件套(以及settings中的mysql配置)
我们的django到底是什么东西呢? 我们的代码都是在后台写的,包括我们的pycharm都是属于后台的工具,但是我们的后端开发说到底是需要开发完了之后拿到用户面前的,让我们的用户看到我们的东西,首先要 ...
- AspectJ(AOP)切面获取参数名称和参数
@Async @AfterReturning(value ="execution(public * com.zhx.recharge.service.RechargeService.buil ...
- 初窥Java之一
一.常用的dos命令 打开命令提示符窗口的方式: ① win + R --> 输入cmd --> 回车 ② 开始 --> 搜索程序和文件的框中输入 cmd --> 回车 ③ ...
- Spark-Unit2-Spark交互式命令行与SparkWordCount
一.Spark交互式命令行 启动脚本:spark-shell 先启动spark:./start-all.sh 本地模式启动命令:/bin/spark-shell 集群模式启动命令:/bin/spark ...
- POJ 2299 Ultra-QuickSort (离散化)+【树状数组】
<题目链接> 题目大意: 给你一段序列,问你如果每次只交换该序列相邻的两个元素,最少需要交换多少步才能够使该序列变为升序排列. 解题分析: 不难发现,其实本题就是让我们求原始序列的逆序对, ...
- 003.Ansible基础使用
一 Ansible命令用法 Ansible命令行执行方式有:Ad-Hoc.Ansible-playbook两种,Web方式其官方提供付费产品Tower.Ad-Hoc主要用于临时命令的执行,Ansibl ...
- webpack 4.x之搭建前端开发环境
webpack是一个现代JavaScript应用程序的静态模块打包器,借用官网的一张图,它能够将一些预处理语言,js的最新语法转换成浏览器识别的内容.现在一般的前端框架都有比较成熟的脚手架,大多数对w ...
- javascript的严格模式和正常模式
在js代码中加入"use strict";就相当于进入严格模式,严格模式改变了语法和运行时行为,将隐藏的问题转化为错误. js的严格模式有以下特点: 一.变量声明 全局变量必须显示 ...
- React Native升级目标SDK
React Native升级目标SDK 打开在 android/app/的build.gradle 找到 android { } 区块 改变以下属性 compileSdkVersion 26 buil ...
- Java 接口 Cloneable
Cloneable接口的目的是作为对象的一个mixin接口,表明这样的对象允许克隆.如果一个类实现了Cloneable接口,Object的clone方法就返回该对象的逐域拷贝,相当于无需调用构造器就可 ...