- 浏览: 600119 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
客户端
设置消息的长度:buffer.writeInt(classByte.length);
写入消息内容:buffer.writeBytes(classByte);
传输内容:channel.write(buffer);
服务端
读取消息长度:int msgBodyLen = buffer.readInt();
判断是否相等:if (buffer.readableBytes() >= msgBodyLen )
转自:http://budairenqin.iteye.com/blog/1788839
设置消息的长度:buffer.writeInt(classByte.length);
写入消息内容:buffer.writeBytes(classByte);
传输内容:channel.write(buffer);
package hotswap.client; import hotswap.JavacTool; import hotswap.NamedThreadFactory; import java.net.InetSocketAddress; import java.nio.charset.Charset; import java.util.Arrays; import java.util.List; import java.util.concurrent.Executors; 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.ChannelFactory; import org.jboss.netty.channel.ChannelFuture; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; public class HotSwapClient { // 因ChannelFactory的关闭有DirectMemory泄露,采用静态化规避 // https://issues.jboss.org/browse/NETTY-424 private static final ChannelFactory channelFactory = new NioClientSocketChannelFactory( Executors.newSingleThreadExecutor(new NamedThreadFactory("HotSwapClient_Boss", true)), Executors.newSingleThreadExecutor(new NamedThreadFactory("HotSwapClient_Worker", true)), 1); public static void main(String[] args) { send(connect()); } public static void send(ChannelFuture future) { if (future.isCancelled()) { // Connection attempt cancelled by user System.out.println("isCanncelled"); } else if (!future.isSuccess()) { future.getCause().printStackTrace(); System.out.println("isNotSuccess"); } else { // Connection established successfully Channel channel = future.getChannel(); channel.setInterestOps(Channel.OP_READ_WRITE); // 编译参数 List<String> otherArgs = Arrays.asList("-classpath", HotSwapClient.class.getProtectionDomain().getCodeSource().getLocation().toString()); // 编译 byte[] classByte = JavacTool.callJavac(otherArgs, "test.HotSwap"); ChannelBuffer buffer = ChannelBuffers.buffer(classByte.length + 4); buffer.writeInt(classByte.length); buffer.writeBytes(classByte); channel.write(buffer); } } public static ChannelFuture connect() { ClientBootstrap bootstrap = new ClientBootstrap(channelFactory); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new SimpleChannelHandler() { @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { System.out.println("channelConnected"); } @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { ChannelBuffer buffer = (ChannelBuffer) e.getMessage(); System.out.println(buffer.toString(Charset.forName("UTF-8"))); System.out.flush(); e.getChannel().close(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { System.out.println("client exceptionCaught"); e.getCause().printStackTrace(); e.getChannel().close(); } }); } }); bootstrap.setOption("tcpNoDelay", true); bootstrap.setOption("keepAlive", true); ChannelFuture future = bootstrap.connect(new InetSocketAddress("127.0.0.1", 20001)); future.awaitUninterruptibly(); return future; } }
服务端
读取消息长度:int msgBodyLen = buffer.readInt();
判断是否相等:if (buffer.readableBytes() >= msgBodyLen )
package hotswap.server; import hotswap.JavaClassExecuter; import hotswap.NamedThreadFactory; import java.net.InetSocketAddress; import java.nio.charset.Charset; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.Bootstrap; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelException; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; import org.jboss.netty.handler.codec.frame.FrameDecoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The HotSwapServer represents * @version $Id$ * @author fengjiachun */ public class HotSwapServer extends AbstractNettyServer { private static final Logger LOG = LoggerFactory.getLogger(HotSwapServer.class); static { try { new HotSwapServer().startServer(); } catch (Exception e) { LOG.error("start HotSwapServer error {}", e); } } @Override public Bootstrap createServerBootstrap() { ExecutorService boss = Executors.newSingleThreadExecutor(new NamedThreadFactory("HotSwapServer_Boss")); ExecutorService worker = Executors.newSingleThreadExecutor(new NamedThreadFactory("HotSwapServer_Worker")); this.serverBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(boss, worker, 1)); return this.serverBootstrap; } @Override public TRANSMISSION_PROTOCOL getTransmissionProtocol() { return TRANSMISSION_PROTOCOL.TCP; } @Override public void startServer() throws Exception { startServer(20001); } @Override public void startServer(int port) throws Exception { InetSocketAddress socketAddress = new InetSocketAddress(port); startServer(socketAddress); } @Override public void startServer(InetSocketAddress socketAddress) throws Exception { setPipelineFactory(new HotSwapPipelineFactory()); String[] optionsList = new String[2]; optionsList[0] = "child.tcpNoDelay"; // 关闭Nagle算法 optionsList[1] = "child.keepAlive"; // TCP定期发送心跳包,应用层不应该依赖这个选项,应用层有自己的心跳机制 configureServerBootStrap(optionsList); try { ((ServerBootstrap) this.serverBootstrap).bind(socketAddress); if (LOG.isInfoEnabled()) { LOG.info("HotSwapServer start, port=" + socketAddress.getPort()); } } catch (ChannelException e) { LOG.error("Unable to start HotSwapServer due to error {}", e); throw e; } } class HotSwapPipelineFactory implements ChannelPipelineFactory { private SimpleChannelHandler messageReceivedHandler = new SimpleChannelHandler() { @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { byte[] classByte = (byte[]) e.getMessage(); // 执行传过来的字节 String resultMsg = JavaClassExecuter.execute(classByte); byte[] resultByte = resultMsg.getBytes(Charset.forName("UTF-8")); ChannelBuffer buffer = ChannelBuffers.buffer(resultByte.length); buffer.writeBytes(resultByte); e.getChannel().write(buffer); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { LOG.error("HotSwap Exception Caught: {}. Going to close channel.", e.getCause()); e.getChannel().close(); } @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { if (LOG.isInfoEnabled()) { LOG.info("HotSwap Connected Channel with ip: {}.", e.getChannel().getRemoteAddress()); } } @Override public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { if (LOG.isInfoEnabled()) { LOG.info("HotSwap Disconnected Channel with ip: {}.", e.getChannel().getRemoteAddress()); } } }; @Override public ChannelPipeline getPipeline() throws Exception { return addHandlers(Channels.pipeline()); } public ChannelPipeline addHandlers(ChannelPipeline pipeline) { if (null == pipeline) { return null; } pipeline.addLast("hotSwapDecoder", new FrameDecoder() { @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { if (buffer.readableBytes() >= 4) { buffer.markReaderIndex(); // 标记ReaderIndex int msgBodyLen = buffer.readInt(); // 前四个字节存放消息的长度 if (buffer.readableBytes() >= msgBodyLen) { ChannelBuffer dst = ChannelBuffers.buffer(msgBodyLen); buffer.readBytes(dst, msgBodyLen); return dst.array(); } else { buffer.resetReaderIndex(); return null; } } return null; } }); pipeline.addLast("hotSwapHandler", messageReceivedHandler); return pipeline; } } }
转自:http://budairenqin.iteye.com/blog/1788839
- 1eaa4ef8-a1a9-3282-aa98-53ad5f557021.zip (49.6 KB)
- 下载次数: 4
发表评论
文章已被作者锁定,不允许评论。
-
java WeakHashMap学习(key是弱引用)
2018-06-21 09:31 1232在Java集合中有一种特殊的Map类型:WeakHashMap ... -
java HashMap TreeMap(key顺序) LinkedHashMap(插入顺序)学习
2018-06-07 10:27 953java为数据结构中的映射定义了一个接口java.util.M ... -
java RESTful 详解
2018-04-27 11:35 643(1)每一个URI代表一种资源,独一无二; (2)客户端 ... -
java 通过HttpsUrlConnection访问接口数据
2018-04-19 11:25 990server: ssl: key-stor ... -
java 使用多线程的场景总结
2018-04-10 14:35 1704在一个高并发的网站中,多线程是必不可少的。下面先说一下多线程在 ... -
java Enum枚举设置
2018-04-10 10:55 480/** * 数据状态:0:无效,1:有效 **/ ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1622REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
java FYOpenApi实现短信发送
2018-01-02 17:10 11741.配置文件 sms.OpenUrl = http://s ... -
java JSONObject序列化包含Date类型数据的Java对象
2017-12-26 16:31 1617如果Date.class无法进行转换则使用Timestamp. ... -
java 用HttpsURLConnection进行传递中文时错误总结
2017-12-07 16:42 654传递中文时需要用Writer而不是OutputStream ... -
java 内存泄漏
2017-11-27 13:51 4961.内存溢出 out of memory ... -
ActiveMQ 三种发送消息方式(同步,异步,单向)
2017-11-17 10:25 2454MQ 发送普通消息有三种实现方式:可靠同步发送、可靠异步发送、 ... -
java Guava ListenableFuture实现线程回调功能
2017-11-14 10:17 1775java Future具有局限性。在实际应用中,当需要下 ... -
java Curator实现分布式锁
2017-09-05 14:39 1090Curator实现分布式锁主要依赖于zookeeper ... -
java Guava工具集学习(强大)
2017-09-05 10:28 433import java.util.Iterator ... -
java CyclicBarrier进行并发编程
2017-08-25 15:44 673CyclicBarrier允许一组线程相互等待达到一个公共的障 ... -
java 几种性能优化的总结
2017-08-23 14:08 3251、使用StringBuilder 一般 ... -
java 使用kyro进行高性能序列化对象和集合
2017-08-23 14:05 2152import java.io.ByteArrayInp ... -
java 对重复电话号码进行排除的优化(排序和前后对比)
2017-08-22 14:14 7911.先对10万数据排序; 2.对比前后两条数据 ; 3.筛 ... -
ActiveMQ 结合Spring进行数据同步
2017-07-19 15:27 584注意事项hibernate配置文件必须设置自动提交否则不能插入 ...
相关推荐
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
thymeleaf.zip"项目中,开发者整合了这两个技术,创建了一个系统,使得硬件设备能够通过TCP协议与Netty服务器进行通信,然后将接收到的硬件运行数据实时展示在基于Thymeleaf的Web页面上,实现了硬件状态的远程监控和...
在Java编程领域,远程控制是一项重要的技术,它允许一台计算机通过网络对另一台计算机...它涵盖了项目结构、配置管理、网络通信、安全性以及多线程等多个关键知识点,对于学习和理解Java远程控制技术具有很高的价值。
总的来说,"JAVA版基于netty的物联网高并发智能网关"是一个实用的项目,对于理解物联网系统架构、学习Netty框架以及提升Java网络编程技能都有很大的帮助。通过深入研究和实践,我们可以构建出更强大、更适应实际需求...
本项目主要用于远程采集华为逆变器使用modbus tcp协议进行通讯的设备数据。 主要使用对象是华为逆变器。 主要采用对接文档是 SUN2000L V100R001 MODBUS 接口定义描述 采用netty 4.1.22.Final 版本作为高并发的底层...
2. **编译器**: 使用protoc将.proto文件编译为不同语言的代码(如Java、Python、C++),生成的消息类可以方便地序列化和反序列化。 3. **消息类型**: Protobuf中的基本数据结构,可以包含多个字段,每个字段都有唯一...
中微子代理(neutrino-proxy)是一款专为程序员和IT专业人员设计的开源Java内网穿透工具,它基于高...对于想要深入学习网络编程、内网穿透技术和Java框架应用的开发者来说,中微子代理及其源代码是一个宝贵的学习资源。
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
在IT行业中,485通讯通常指的是使用RS-485接口进行通信的方式,它是一种广泛应用于工业控制、远程监控等领域的串行通信标准。RS-485提供了一个多点、半双工的通信环境,允许在一条总线上连接多个设备。自由协议则是...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高...通过学习和使用这个项目,开发者可以提升对 Netty 框架以及 WebSocket 协议的理解,同时也能掌握如何构建高效、灵活的网络代理服务。
在给定的上下文中,我们有两个关键的JAR文件:`libthrift.jar` 和 `netty-all-4.1.50.Final.jar`,它们在Java开发中扮演着重要角色,特别是对于网络通信和分布式系统。以下是关于这两个文件和它们所涉及的技术点的...
JVM是Java程序运行的底层平台,它负责将Java代码编译成字节码执行,并且提供内存管理、垃圾回收等机制。JVM内存区域包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。程序计数器、虚拟机栈和本地方法栈是线程私有...