`
youyu4
  • 浏览: 440159 次
社区版块
存档分类
最新评论

java Netty 之 Object对象传递

 
阅读更多

java Netty 之 Object对象传递

 

 

      您应该也会想到,我们说过,Netty的消息传递都是基于流,通过ChannelBuffer传递的,那么自然,Object也需要转换成ChannelBuffer来传递。好在Netty本身已经给我们写好了这样的转换工具。ObjectEncoder和ObjectDecoder。

 

      工具怎么用?再一次说说所谓的本质,我们之前也说过,Netty给我们处理自己业务的空间是在灵活的可子定义的Handler上的,也就是说,如果我们自己去做这个转换工作,那么也应该在Handler里去做。而Netty,提供给我们的ObjectEncoder和Decoder也恰恰是一组Handler。

 

修改Server和Client的启动代码:

 

// 设置一个处理客户端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
	@Override
	public ChannelPipeline getPipeline() throws Exception {
		return Channels.pipeline(
			new ObjectDecoder(ClassResolvers.cacheDisabled(
				this.getClass().getClassLoader())),
			new ObjectServerHandler());
	}
});

// 设置一个处理服务端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
	@Override
	public ChannelPipeline getPipeline() throws Exception {
		return Channels.pipeline(
			new ObjectEncoder(),
			new ObjectClientHandler());
	}
});

 

要传递对象,自然要有一个被传递模型,一个简单的Pojo,当然,实现序列化接口是必须的。

 

public class Command implements Serializable {
 
	private static final long serialVersionUID = 7590999461767050471L;
 
	private String actionName;
	 
	public String getActionName() {
		return actionName;
	}
	 
	public void setActionName(String actionName) {
		this.actionName = actionName;
	}
}

 

服务端和客户端里,我们自定义的Handler实现如下:

 

public class ObjectServerHandler extends SimpleChannelHandler {
 
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
		throws Exception {
		Command command = (Command) e.getMessage();
		// 打印看看是不是我们刚才传过来的那个
		System.out.println(command.getActionName());
	}
}

/**
* 对象传递,客户端代码
*/
public class ObjectClientHandler extends SimpleChannelHandler {
 
	/**
	* 当绑定到服务端的时候触发,给服务端发消息。
	*/
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
		// 向服务端发送Object信息
		sendObject(e.getChannel());
	}
 
	/**
	* 发送Object
	*/
	private void sendObject(Channel channel) {
		Command command = new Command();
		command.setActionName("Hello action.");
		channel.write(command);
	}
 
}

 

启动后,服务端正常打印结果:Hello action.

 

简单梳理一下思路:

 

  1. 通过Netty传递,都需要基于流,以ChannelBuffer的形式传递。所以,Object -> ChannelBuffer.
  2. Netty提供了转换工具,需要我们配置到Handler。
  3. 样例从客户端 -> 服务端,单向发消息,所以在客户端配置了编码,服务端解码。如果双向收发,则需要全部配置Encoder和Decoder。

 

 

注意:

 

注册到Server的Handler是有顺序的,如果你颠倒一下注册顺序:

 

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
	@Override
	public ChannelPipeline getPipeline() throws Exception {
		return Channels.pipeline(
			new ObjectServerHandler(),
			new ObjectDecoder(ClassResolvers.cacheDisabled(this
				.getClass().getClassLoader())));
	}
});

 

结果就是,会先进入我们自己的业务,再进行解码。这自然是不行的,会强转失败。

 

 

 

如果想自己对Object进行编\解码,可以参考下面:

http://www.it165.net/pro/html/201207/3328.html

分享到:
评论

相关推荐

    Netty之序列化协议

    在分布式系统和网络通信中,序列化是必不可少的,因为它允许对象在不同进程或计算机之间传递。Netty支持多种序列化协议,如Java自带的序列化、protobuf、JSON等,以满足不同场景的需求。 1. **Java序列化**:Java...

    Netty中Protobuf编解码应用

    Netty的ChannelHandler接口提供了编码和解码的回调方法,如`channelRead0(ChannelHandlerContext ctx, Object msg)`和`writeAndFlush(ChannelHandlerContext ctx, Object msg, ChannelPromise promise)`。...

    Netty中Marshalling编解码自定义栈应用

    这两个类提供了与特定 Marshalling 实现(如 XStream、protobuf 等)的接口集成,以便在 Netty 通道之间安全地传递对象。 要自定义 Marshalling 编解码器,首先你需要选择一个适合你的 Marshalling 库。例如,如果...

    netty收发消息增查数据库,获取在线客户端数,pom项目

    1. **Netty的消息收发机制**:Netty 使用ChannelHandlerContext作为消息传递的核心对象,它包含了发送和接收消息的方法。当客户端连接到服务器时,Netty会创建一个ChannelHandlerContext对象,通过这个对象,我们...

    基于netty5的自定义协议Demo

    在Netty的管道(Pipeline)中,编码器和解码器会被添加到相应的通道上下文(ChannelHandlerContext)中,当数据从客户端传来时,会先经过解码器处理,然后传递给其他处理器;反之,当数据要发送到客户端时,会先经过...

    netty消息拆包粘包编解码(java代码)

    在这个例子中,我们创建了一个服务器,它使用`LengthFieldBasedFrameDecoder`来处理粘包和拆包的问题,然后将解码后的数据传递给`MyBusinessHandler`进行进一步的业务处理。 以上就是关于Netty消息拆包粘包编解码的...

    nettyObject:关于 netty 的例子

    在 Java 开发中,Netty 因其高效性、灵活性和广泛的社区支持而备受青睐。 首先,让我们深入理解 Netty 的核心概念: 1. **NIO (Non-blocking I/O)**:Netty 基于 Java NIO(非阻塞I/O)构建,允许通过单线程处理多...

    netty编码器,解码器实例

    通过深入研究Netty的源码,我们可以了解其内部的工作原理,例如,如何调度事件,如何在编码器和解码器之间传递数据,以及如何利用零拷贝技术提高性能。源码分析可以帮助我们更好地优化自定义编码器和解码器的实现,...

    Java 开源聊天室

    1. Java编程语言:Java以其跨平台性、面向对象和安全性等特点成为开发聊天室的理想选择。项目中会涉及到类、对象、接口、异常处理等基础概念。 2. 多线程:为了实现多用户并发聊天,Java的多线程机制至关重要。通过...

    Java网络编程与分布式计算.pdf

    Java通过RMI(Remote Method Invocation)提供了一种分布式对象交互的方式。RMI允许Java对象在不同的虚拟机上进行方法调用,就好像是在同一台机器上一样。RMI使用JRMP(Java Remote Method Protocol)作为底层传输...

    java开发常用jar包之json-rpc.rar

    JSON-RPC是一种轻量级的远程过程调用(Remote Procedure Call)协议,它使用JSON(JavaScript Object Notation)作为数据交换格式。在Java开发中,JSON-RPC库可以帮助开发者实现客户端和服务端之间的通信,尤其在...

    netty-fixedlengthdata-transfer

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和...这个项目不仅涉及网络编程,还涵盖了Java并发和内存管理等多方面的知识,对于深入理解和应用Netty框架非常有帮助。

    游戏开发中的protobuf自动解码DEMO

    在客户端,我们则需要将Java对象序列化为protobuf格式的字节流,然后通过Netty的`ChannelHandlerContext`写入网络: ```java public class ProtobufEncoder extends MessageToByteEncoder<PlayerState> { @...

    Json-lib的六个jar包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。Json-lib是一个Java库,它提供了将Java对象转换为JSON格式以及从JSON数据还原Java对象的功能。Json-lib支持...

    第七章:编解码器Codec.pdf

    Netty中提供的ByteToMessageDecoder可以将字节消息解码成POJO对象,下面列出了ByteToMessageDecoder两个主要方法: * decode(ChannelHandlerContext, ByteBuf, List<Object>),这个方法是唯一的一个需要自己实现的...

    java面试题

    ### Java面试题详解 #### 短类型变量与自动类型提升问题 ...以上是对Java面试题的详细解答,涵盖了基础类型操作、面向对象特性、异常处理、集合框架、多线程、框架应用等多个方面,希望对准备面试的朋友有所帮助。

    java程序员面试大纲错过了金三银四你还要错过2018吗.docx

    `finalize`是Object类中的一个方法,用于对象被垃圾回收前的清理工作,但在实际应用中很少使用。 7. **强引用、软引用、弱引用、虚引用**:不同类型的引用决定了对象的生命周期。强引用的对象不会被垃圾回收器回收...

    ssh2的整合jar包

    3. **Hibernate**:是一个ORM(Object-Relational Mapping)框架,它允许开发者用Java对象来操作数据库,减少了直接编写SQL的需要。Hibernate提供了透明的数据持久化层,简化了数据库操作。 在整合这三大框架时,...

Global site tag (gtag.js) - Google Analytics