以下两个例子基于netty-3.5.7.Final.jar用Junit进行测试
第一个例子:简单的发送字符串,接收字符串“Hello, World”
- class HelloWorldServerHandler extends SimpleChannelHandler {
- public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
- throws Exception {
- e.getChannel().write("Hello, World");
- }
- public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
- System.out.println("Unexpected exception from downstream."
- + e.getCause());
- e.getChannel().close();
- }
- }
- class HelloWorldClientHandler extends SimpleChannelHandler {
- public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
- String message = (String) e.getMessage();
- System.out.println(message);
- e.getChannel().close();
- }
- public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
- System.out.println("Unexpected exception from downstream."
- + e.getCause());
- e.getChannel().close();
- }
- }
- /**
- * Netty VS MinaNetty基于Pipeline处理,Mina基于Filter过滤
- * Netty的事件驱动模型具有更好的扩展性和易用性
- * Https,SSL,PB,RSTP,Text &Binary等协议支持
- * Netty中UDP传输有更好的支持官方测试Netty比Mina性能更好
- * @author Administrator
- *
- */
- public class TestCase {
- public void testServer() {
- //初始化channel的辅助类,为具体子类提供公共数据结构
- ServerBootstrap bootstrap = new ServerBootstrap(
- new NioServerSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
- public ChannelPipeline getPipeline() {
- ChannelPipeline pipeline = Channels.pipeline();
- pipeline.addLast("decoder", new StringDecoder());
- pipeline.addLast("encoder", new StringEncoder());
- pipeline.addLast("handler", new HelloWorldServerHandler());
- return pipeline;
- }
- });
- //创建服务器端channel的辅助类,接收connection请求
- bootstrap.bind(new InetSocketAddress(8080));
- }
- public void testClient() {
- //创建客户端channel的辅助类,发起connection请求
- ClientBootstrap bootstrap = new ClientBootstrap(
- new NioClientSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- //It means one same HelloWorldClientHandler instance is going to handle multiple Channels and consequently the data will be corrupted.
- //基于上面这个描述,必须用到ChannelPipelineFactory每次创建一个pipeline
- bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
- public ChannelPipeline getPipeline() {
- ChannelPipeline pipeline = Channels.pipeline();
- pipeline.addLast("decoder", new StringDecoder());
- pipeline.addLast("encoder", new StringEncoder());
- pipeline.addLast("handler", new HelloWorldClientHandler());
- return pipeline;
- }
- });
- //创建无连接传输channel的辅助类(UDP),包括client和server
- ChannelFuture future = bootstrap.connect(new InetSocketAddress(
- "localhost", 8080));
- future.getChannel().getCloseFuture().awaitUninterruptibly();
- bootstrap.releaseExternalResources();
- }
- @Test
- public void testNetty(){
- testServer();
- testClient();
- }
- }
第二个例子,实际应用中会用到这个,发送POJO类Persons [name=周杰伦123, age=31, salary=10000.44]
- /**
- * 用POJO代替ChannelBuffer
- */
- class TimeServerHandler3 extends SimpleChannelHandler {
- @Override
- public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
- throws Exception {
- Persons person = new Persons("周杰伦123",31,10000.44);
- ChannelFuture future = e.getChannel().write(person);
- future.addListener(ChannelFutureListener.CLOSE);
- }
- }
- class TimeClientHandler3 extends SimpleChannelHandler{
- @Override
- public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
- throws Exception {
- Persons person = (Persons)e.getMessage();
- System.out.println(person);
- e.getChannel().close();
- }
- }
- /**
- * FrameDecoder and ReplayingDecoder allow you to return an object of any type.
- *
- */
- class TimeDecoder extends FrameDecoder {
- private final ChannelBuffer buffer = dynamicBuffer();
- @Override
- protected Object decode(ChannelHandlerContext ctx, Channel channel,
- ChannelBuffer channelBuffer) throws Exception {
- if(channelBuffer.readableBytes()<4) {
- return null;
- }
- if (channelBuffer.readable()) {
- // 读到,并写入buf
- channelBuffer.readBytes(buffer, channelBuffer.readableBytes());
- }
- int namelength = buffer.readInt();
- String name = new String(buffer.readBytes(namelength).array(),"GBK");
- int age = buffer.readInt();
- double salary = buffer.readDouble();
- Persons person = new Persons(name,age,salary);
- return person;
- }
- }
- class TimeEncoder extends SimpleChannelHandler {
- private final ChannelBuffer buffer = dynamicBuffer();
- @Override
- public void writeRequested(ChannelHandlerContext ctx, MessageEvent e)
- throws Exception {
- Persons person = (Persons)e.getMessage();
- buffer.writeInt(person.getName().getBytes("GBK").length);
- buffer.writeBytes(person.getName().getBytes("GBK"));
- buffer.writeInt(person.getAge());
- buffer.writeDouble(person.getSalary());
- Channels.write(ctx, e.getFuture(), buffer);
- }
- }
- class Persons{
- private String name;
- private int age;
- private double salary;
- public Persons(String name,int age,double salary){
- this.name = name;
- this.age = age;
- this.salary = salary;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public double getSalary() {
- return salary;
- }
- public void setSalary(double salary) {
- this.salary = salary;
- }
- @Override
- public String toString() {
- return "Persons [name=" + name + ", age=" + age + ", salary=" + salary
- + "]";
- }
- }
- public class TestCase5 {
- public void testServer() {
- ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
- ServerBootstrap bootstrap = new ServerBootstrap(factory);
- bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
- public ChannelPipeline getPipeline() throws Exception {
- return Channels.pipeline(new TimeEncoder(), new TimeServerHandler3());
- }
- });
- bootstrap.setOption("child.tcpNoDelay", true);
- bootstrap.setOption("child.keepAlive", true);
- bootstrap.bind(new InetSocketAddress("localhost",9999));
- }
- public void testClient(){
- //创建客户端channel的辅助类,发起connection请求
- ClientBootstrap bootstrap = new ClientBootstrap(
- new NioClientSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
- public ChannelPipeline getPipeline() {
- ChannelPipeline pipeline = Channels.pipeline();
- pipeline.addLast("decoder", new TimeDecoder());
- pipeline.addLast("encoder", new TimeEncoder());
- pipeline.addLast("handler", new TimeClientHandler3());
- return pipeline;
- }
- });
- //创建无连接传输channel的辅助类(UDP),包括client和server
- ChannelFuture future = bootstrap.connect(new InetSocketAddress(
- "localhost", 9999));
- future.getChannel().getCloseFuture().awaitUninterruptibly();
- bootstrap.releaseExternalResources();
- }
- @Test
- public void testNetty() {
- testServer();
- testClient();
- }
- }
这两段代码是学习的时候参考别人的代码,转于哪想不起来了,但是这两段代码让我了解了netty的通信流程。
相关推荐
在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...
在本文中,我们将深入探讨Netty在实际应用中的实例——对象传递调用,以及如何解决TCP粘包问题。同时,我们还会讨论Java序列化方案在Netty中的编解码对比。 首先,让我们来看看TCP粘包问题。在TCP协议中,由于其...
通过学习《Netty实战——netty-in-action》,读者将掌握如何利用Netty构建高效率、高可用性的网络应用,提升软件系统的性能和稳定性。书中包含的实例代码和最佳实践将帮助开发者在实际项目中快速上手并熟练运用Netty...
2. **快速入门**:演示如何创建一个简单的服务器和客户端,让读者对Netty的使用有初步认识。 3. **Channel与Pipeline**:讲解Netty的核心组件,包括Channel负责网络通信,Pipeline处理数据传输过程中的事件和处理...
在本文中,我们将深入探讨Netty 4.0的学习笔记,特别是关于Server与Client之间的通信机制。 首先,我们要理解Netty的核心概念——NIO(非阻塞I/O)。Netty基于Java NIO库构建,它提供了更高级别的API,简化了多路...
1. 参数处理:`group` 指定了 `ChannelHandler` 执行的事件选择器,如果为空则使用 `Channel` 注册的事件循环;`name` 是处理器的名称;`handler` 是要添加的处理器实例。 2. 重复添加检查:通过 `...
本书首先会介绍Netty的基本架构,包括其核心概念——Boss线程、Worker线程、EventLoop和Channel,这些是Netty异步I/O的基础。接着,会详细解析Netty的ByteBuf,这是一个高效的数据缓冲区,用于在网络通信中传输数据...
Netty推送系统是一种基于Java开发的高性能网络通信框架——Netty实现的实时消息推送平台。在点对点的通信场景中,它能够高效地将数据从服务器推送到客户端,广泛应用于实时聊天、通知推送、游戏同步等场景。下面将...
本篇文章将深入探讨如何基于Netty5实现一个自定义协议——luck协议,以及相关的编码解码过程。 首先,让我们理解什么是Netty。Netty是由JBOSS提供的一个Java开源框架,它的核心特性包括:非阻塞I/O模型、高效的缓冲...
对于初学者,可以按照总分总的结构,将Netty的知识点拆分为各个模块进行学习,每个模块都通过实例演示、尝试和调试来加深理解。通过这样的学习过程,最终目标是能够熟练掌握Netty底层原理,解决实际遇到的复杂问题,...
Netty通过使用ChannelPromise和Future,提供了一种异步编程模型,可以避免同步锁的使用,降低并发编程的复杂性。同时,Netty内部对共享数据进行了适当的同步控制,保证了在多线程环境下的正确性。 总的来说,Netty...
《深入剖析Netty框架——基于itstack-demo-netty-master.zip》 Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本项目"itstack-demo-netty-master.zip"是针对...
### Netty源码解析——服务启动过程 #### 一、Netty概述 Netty是一个高性能、异步事件驱动的网络应用框架,它被广泛应用于快速开发高性能协议服务器和客户端。Netty通过高度优化的设计和实现提供了低延迟和高吞吐...
本篇文章将从OSI七层模型、TCP与UDP的异同点、BIO、NIO、AIO的简述以及Netty的基本使用等方面展开讨论。 首先,理解网络通信的基础——OSI七层模型是至关重要的。OSI模型是国际标准化组织提出的一种通信参考模型,...
本文将深入探讨一个独特的项目——"zoro-netty-tomcat",这是一个利用Java的Netty框架来手写实现Tomcat服务器的实例。通过这个项目,我们可以学习到如何利用Netty构建高性能、异步非阻塞的网络应用,以及理解Tomcat...
这两种机制虽然目标相似——即保证连接的有效性——但在实现原理和应用场景上有所区别。 #### 二、空闲检测机制 ##### 2.1 基本概念 - **空闲检测** 是一种基于应用层的自定义机制,主要用于检测客户端与服务器...
建立在 Netty 之上,专为高并发场景而设计,其中多个线程可以使用同一个客户端实例,而无需担心外部或内部同步,它可以帮助您减少初始化和/或准备时间以及资源浪费。 在许多小的优化中,只要有可能就重用连接,这...
描述中提到的"基于Netty实现Redis的代理"揭示了该项目的核心技术——Netty。Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。Netty的非阻塞I/O模型使得它非常适合...