首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Netty札记二(发送对象-服务端客户端附可运行源码)

2013-05-02 
Netty笔记二(发送对象--服务端客户端附可运行源码)网络传输的时候采用的是流的形式,所以一个对象要发出去,

Netty笔记二(发送对象--服务端客户端附可运行源码)

网络传输的时候采用的是流的形式,所以一个对象要发出去,并且在服务端要收到一个完整的对象,就要相应的编码解码的过程,这个例子向您展示netty的ObjectEncoder和ObjectDecoder编码解码的过程,代码写的比较简单而且注释比较多就直接用代码了

Server 服务器端的启动程序

package com.my.day2;import java.net.InetSocketAddress;import java.util.concurrent.Executors;import org.jboss.netty.bootstrap.ServerBootstrap;import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;/**    * @Title: Server.java  * @Package com.my.day2  * @Description: TODO * @author jimmy lovelyxuehanxin@163.com    * @date 2013-4-22 下午8:06:41  */public class Server {public void run(){NioServerSocketChannelFactory channelFactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());ServerBootstrap bootstrap = new ServerBootstrap(channelFactory);bootstrap.setPipelineFactory(new ServerChannelPipelineFactory());bootstrap.setOption("tcpNoDelay", true);bootstrap.setOption("keepAlive", true);bootstrap.bind(new InetSocketAddress(8080));}}

?ServerChannelPipelineFactory

?

package com.my.day2;import org.jboss.netty.channel.ChannelPipeline;import org.jboss.netty.channel.ChannelPipelineFactory;import org.jboss.netty.channel.Channels;import org.jboss.netty.handler.codec.serialization.ClassResolvers;import org.jboss.netty.handler.codec.serialization.ObjectDecoder;/**    * @Title: MyChannelFactory.java  * @Package com.my.day2  * @Description: 自定义ChannelPipelineFactory * @author jimmy lovelyxuehanxin@163.com    * @date 2013-4-22 下午8:08:35  */public class ServerChannelPipelineFactory implements ChannelPipelineFactory{@Overridepublic ChannelPipeline getPipeline() throws Exception {ChannelPipeline channelPipeline = Channels.pipeline();/** *  往流水线里添加任务,这里写netty聊天的时候主要的协议解析和逻辑处理 *  例如1.我要对我传送的内容进行加密解密 *  2.我要确定每次客户端传送给服务端的内容是多少 *  3.我要对根究客户端发送的内容确定调用哪端业务逻辑 *  4.netty框架本身自带了很多Encode和DeCode */channelPipeline.addLast("objectDecode", new ObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())));channelPipeline.addLast("myhandler", new ServerHandler());return channelPipeline;}}

?ServerHandler

?

?

package com.my.day2;import org.jboss.netty.channel.ChannelHandlerContext;import org.jboss.netty.channel.ChannelStateEvent;import org.jboss.netty.channel.MessageEvent;import org.jboss.netty.channel.SimpleChannelUpstreamHandler;/**    * @Title: ServerHandler.java  * @Package com.my.day2  * @Description: TODO * @author jimmy lovelyxuehanxin@163.com    * @date 2013-4-22 下午8:50:46  */public class ServerHandler extends SimpleChannelUpstreamHandler{@Overridepublic void messageReceived(ChannelHandlerContext ctx, MessageEvent e)throws Exception {User user = (User) e.getMessage();System.out.println("form client...." + user.getName());super.messageReceived(ctx, e);}@Overridepublic void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)throws Exception {System.out.println("服务器端进来一个连接");super.channelConnected(ctx, e);}}

?Client

?

?

package com.my.day2;import java.net.InetSocketAddress;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.ChannelFuture;import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;/**    * @Title: Client.java  * @Package com.my.day2  * @Description: TODO * @author jimmy lovelyxuehanxin@163.com    * @date 2013-4-22 下午8:57:02  */public class Client {public void run(){ClientBootstrap bootstap = new ClientBootstrap();NioClientSocketChannelFactory channelFactory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());bootstap.setFactory(channelFactory);bootstap.setPipelineFactory(new ClientChannelPipelineFactory());bootstap.setOption("tcpNoDelay", true);bootstap.setOption("keepAlive", true);ChannelFuture future = bootstap.connect(new InetSocketAddress(8080));User user = new User();user.setName("xuehan");user.setPassword("maybe");future.getChannel().write(user);}}

?ClientChannelPipelineFactory

?

?

package com.my.day2;import org.jboss.netty.channel.ChannelPipeline;import org.jboss.netty.channel.ChannelPipelineFactory;import org.jboss.netty.channel.Channels;import org.jboss.netty.handler.codec.serialization.ObjectEncoder;/**    * @Title: MyChannelFactory.java  * @Package com.my.day2  * @Description: 自定义ChannelPipelineFactory * @author jimmy lovelyxuehanxin@163.com    * @date 2013-4-22 下午8:08:35  */public class ClientChannelPipelineFactory implements ChannelPipelineFactory{@Overridepublic ChannelPipeline getPipeline() throws Exception {ChannelPipeline channelPipeline = Channels.pipeline();/** *  往流水线里添加任务,这里写netty聊天的时候主要的协议解析和逻辑处理 *  例如1.我要对我传送的内容进行加密解密 *  2.我要确定每次客户端传送给服务端的内容是多少 *  3.我要对根究客户端发送的内容确定调用哪端业务逻辑 *  4.netty框架本身自带了很多Encode和DeCode */channelPipeline.addLast("objectEncode", new ObjectEncoder());channelPipeline.addLast("myhandler", new ClientHandler());return channelPipeline;}}

?测试类TestServer

package com.my.day2;import org.jboss.netty.buffer.ChannelBuffer;import org.jboss.netty.buffer.ChannelBuffers;import org.jboss.netty.channel.ChannelHandlerContext;import org.jboss.netty.channel.ChannelStateEvent;import org.jboss.netty.channel.MessageEvent;import org.jboss.netty.channel.SimpleChannelDownstreamHandler;/**    * @Title: ClientHandler.java  * @Package com.my.day2  * @Description: TODO * @author jimmy lovelyxuehanxin@163.com    * @date 2013-4-22 下午9:02:50  */public class ClientHandler extends SimpleChannelDownstreamHandler{@Overridepublic void writeRequested(ChannelHandlerContext ctx, MessageEvent e)throws Exception {super.writeRequested(ctx, e);}@Overridepublic void bindRequested(ChannelHandlerContext ctx, ChannelStateEvent e)throws Exception {// TODO Auto-generated method stubsuper.bindRequested(ctx, e);}@Overridepublic void connectRequested(ChannelHandlerContext ctx, ChannelStateEvent e)throws Exception {System.out.println("客户端请求连接");super.connectRequested(ctx, e);}}

?测试类TestServer

package com.my.day2;/**    * @Title: Test.java  * @Package com.my.day2  * @Description: TODO * @author jimmy lovelyxuehanxin@163.com    * @date 2013-4-22 下午9:05:02  */public class TestServer {public static void main(String[] args) throws InterruptedException {Server server = new Server();server.run();Thread.sleep(1000);Client client = new Client();client.run();}}

User

package com.my.day2;import java.io.Serializable;/**    * @Title: User.java  * @Package com.my.day2  * @Description: 用于网络传输的对象必须序列化否则无法传送 * @author jimmy lovelyxuehanxin@163.com    * @date 2013-4-23 下午8:41:59  */public class User implements Serializable{private static final long serialVersionUID = -7198306226394014411L;private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

??

这是一个完整的例子用的netty的maven配置文件是

<dependency>      <groupId>io.netty</groupId>      <artifactId>netty</artifactId>      <version>3.5.6.Final</version> </dependency>

?附件是可以运行代码,依赖jar文件请读者自己去下载

?

?

热点排行