// 设置一个处理客户端消息和各种消息事件的类(Handler)bootstrap.setPipelineFactory(newChannelPipelineFactory() {@OverridepublicChannelPipeline getPipeline()throwsException {returnChannels.pipeline(newObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())),newObjectServerHandler()) }})
客户端
// 设置一个处理服务端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(newChannelPipelineFactory() {@OverridepublicChannelPipeline getPipeline()throwsException {returnChannels.pipeline(newObjectEncoder(),newObjectClientHandler()) }})
要传递对象,自然要有一个被传递模型,一个简单的Pojo,当然,实现序列化接口是必须的。
/** * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class Command implementsSerializable { privatestaticfinallongserialVersionUID = 7590999461767050471LprivateString actionNamepublicString getActionName() {returnactionName } publicvoidsetActionName(String actionName) {this.actionName = actionName }}
服务端和客户端里,我们自定义的Handler实现如下:
ObjectServerHandler .java
/** * 对象传递服务端代码 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectServerHandler extendsSimpleChannelHandler { /** * 当接受到消息的时候触发 */@OverridepublicvoidmessageReceived(ChannelHandlerContext ctx, MessageEvent e)throwsException {Command command = (Command) e.getMessage() // 打印看看是不是我们刚才传过来的那个System.out.println(command.getActionName()) }}
ObjectClientHandler .java
/** * 对象传递,客户端代码 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectClientHandler extendsSimpleChannelHandler { /** * 当绑定到服务端的时候触发,给服务端发消息。 * * @author lihzh * @alia OneCoder */@OverridepublicvoidchannelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {// 向服务端发送Object信息sendObject(e.getChannel()) } /** * 发送Object * * @param channel * @author lihzh * @alia OneCoder */privatevoidsendObject(Channel channel) {Command command =newCommand() command.setActionName("Hello action.") channel.write(command) } }
启动后,服务端正常打印结果:Hello action.
简单梳理一下思路:
通过Netty传递,都需要基于流,以ChannelBuffer的形式传递。所以,Object ->ChannelBuffer.
Netty提供了转换工具,需要我们配置到Handler。
样例从客户端 ->服务端,单向发消息,所以在客户端配置了编码,服务端解码。如果双向收发,则需要全部配置Encoder和Decoder。
这里需要注意,注册到Server的Handler是有顺序的,如果你颠倒一下注册顺序:
bootstrap.setPipelineFactory(newChannelPipelineFactory() {
@OverridepublicChannelPipeline getPipeline()throwsException {returnChannels.pipeline(newObjectServerHandler(),newObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader()))) }})
结果就是,会先进入我们自己的业务,再进行解码。这自然是不行的,会强转失败。至此,你应该会用Netty传递对象了吧。
while(true){buff.clear()
int len = sc.read(buff)
if(len ==-1){ break}
buff.flip()
content += charset.decode(buff)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)