Netty 4 传输对象

  对于Netty在这里就不做过多介绍了,详情咨询http://netty.io/wiki/user-guide-for-4.x.html

  我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持。

  首先我们定义一个User对象,一定要实现Serializable接口:

  


import java.io.Serializable;

/**
* User: hupeng
* Date: 14-6-3
* Time: 上午1:31
*/
public class User implements Serializable {

private int id;

private String name;

private String cardNo;

private String description;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getCardNo() {
return cardNo;
}

public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", name=‘" + name + ‘\‘‘ +
", cardNo=‘" + cardNo + ‘\‘‘ +
", description=‘" + description + ‘\‘‘ +
‘}‘;
}
}

然后定义一个客户端:


import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;

public class ObjectTransferClient {
private String host;

private int port;

private int messageSize;

public ObjectTransferClient(String host, int port, int messageSize) {
this.host = host;
this.port = port;
this.messageSize = messageSize;
}

public void run() throws InterruptedException {
Bootstrap bootstrap = new Bootstrap();
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();

try {
bootstrap.group(eventLoopGroup)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(
new ObjectEncoder(),
new ObjectDecoder(Integer.MAX_VALUE ,ClassResolvers.cacheDisabled(null)),
new ObjectTransferClientHandler(messageSize));
}
});

ChannelFuture future = bootstrap.connect(host, port).sync();

future.channel().closeFuture().sync();
} finally {
eventLoopGroup.shutdownGracefully();
}
}

public static void main(String[] args) throws Exception {
final String host = "127.0.0.1";
final int port = 8080;
final int messageSize = 200;

new ObjectTransferClient(host, port, messageSize).run();
}
}

以及客户端的一个handler


import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ObjectTransferClientHandler extends ChannelInboundHandlerAdapter {

private static final Logger logger = Logger.getLogger(
ObjectTransferClientHandler.class.getName());

private final List<User> message;

/**
* Creates a client-side handler.
*/
public ObjectTransferClientHandler(int messageSize) {
if (messageSize <= 0) {
throw new IllegalArgumentException(
"firstMessageSize: " + messageSize);
}
message = new ArrayList<User>(messageSize);
for (int i = 0; i < messageSize; i ++) {
User user = new User();
user.setId(i);
user.setCardNo("420000" + i);
user.setName("hu" +i);
user.setDescription("你觉得这样好吗??真的好吗" + i);
message.add(user);
}
}

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
// Send the message to Server
ctx.writeAndFlush(message);
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// you can use the Object from Server here
System.out.println(msg);
ctx.close();
}

@Override
public void exceptionCaught(
ChannelHandlerContext ctx, Throwable cause) throws Exception {
logger.log(
Level.WARNING,
"Unexpected exception from downstream.", cause);
ctx.close();
}
}

然后是服务端:


import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;

public class ObjectTranferServer {

private final int port;

public ObjectTranferServer(int port) {
this.port = port;
}

public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(
new ObjectEncoder(),
new ObjectDecoder(Integer.MAX_VALUE,ClassResolvers.cacheDisabled(null)),
new ObjectTransferServerHandler());
}
});

// Bind and start to accept incoming connections.
b.bind(port).sync().channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}

public static void main(String[] args) throws Exception {
int port;
if (args.length > 0) {
port = Integer.parseInt(args[0]);
} else {
port = 8080;
}
new ObjectTranferServer(port).run();
}
}

服务端Handler:


import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.logging.Level;
import java.util.logging.Logger;

public class ObjectTransferServerHandler extends ChannelInboundHandlerAdapter {

private static final Logger logger = Logger.getLogger(
ObjectTransferServerHandler.class.getName());

@Override
public void channelRead(
ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println(msg);
ctx.write(msg);
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
ctx.close();
}

@Override
public void exceptionCaught(
ChannelHandlerContext ctx, Throwable cause) throws Exception {
logger.log(
Level.WARNING,
"Unexpected exception from downstream.", cause);
ctx.close();
}
}

这里我传入的size为200的一个list对象。
当我把size增加到1000的时候,客户端和服务端都不报任何错误,但是也接收不到值。。具体原因还在寻找中,如果亲爱的你,可以指点一下我,那简直就是太好了。。。。

当然我们也可以采取其他方式,比如在客户端和服务端,通过json来序列化和反序列化传递,然后按照String来处理就行了

  

时间: 2024-10-22 08:34:16

Netty 4 传输对象的相关文章

Netty JDK序列化编解码传输对象

JDK序列化不需要额外的类库,只需要实现Serializable即可,但是序列化之后的码流只有Java才能反序列化,所以它不是跨语言的,另外由于Java序列化后码流比较大,效率也不高,所以在RPC中很少使用,本文只是做学习之用. 编解码器: public class JdkDecoder extends MessageToMessageDecoder<ByteBuf> { @Override protected void decode(ChannelHandlerContext channel

巧用Android网络通信技术,在网络上直接传输对象

本文首发于CSDN博客,转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8967080 要做一个优秀的Android应用,使用到网络通信技术是必不可少的,很难想象一款没有网络交互的软件最终能发展得多成功.那么我们来看一下,一般Android应用程序里都是怎么实现网络交互的,这里拿一个Boook对象为例: 如上图所示,首先在手机端生成一个Book对象,里面包含书名.作者.价格等数据.为了要将这些数据发送到服务器端,我们要从Book对

Mina使用总结(四)传输对象ObjectSerializationCodecFactory

用mina框架传输对象,对于开发者来说,直接传输对象,而不用自己编写相应的报文转换代码,将大大节省 开发时间. 即使用对象编码解码器 使用ObjectSerializationCodecFactory 服务端 MinaServer.java代码如下 package com.bypay.mina.server; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress;

Netty4 服务器 客户端 传输对象

关键词:netty4  对象  序列化 废话少说,直接上代码了 Client.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 import io.netty.bootstrap.Bootstrap;

使用Socket传输对象

在使用QT网络通信时一直是简单的发送数据--接收数据,常见的就是发送一个字符串/字节流,然后根据这个字符串/字节流提取出有用的信息. 这样在不是很复杂的通信中可以满足实际需要.但也有弊端,就是每次写网络通信时都是口头约定一个协议,让发送方与接收方都满足这个协议才可以进行正常通信. 这样如果我每次写这样的程序,我都要首先规定好一个的通讯协议,然后再编写相应的代码. 那么如何传输更复杂的数据呢,而且可以不用上述的口头协议? 在JAVA,C#中都有对对象序列化的概念,QT里也有,利用将对象序列化传输可

socket传输对象

server public class Server{ private static int port = 8888; private static ServerSocket serverSocket; private static Socket socket; public static void main(String args[]) throws IOException { serverSocket = new ServerSocket(port, 2); socket = serverS

mina传输对象

接触java的Mina框架已经有很多时间了,在网上也读过了很多的相关文章,发现Mina框架的确是一个值得拿来好好研究的东西,前些日子写了一个山寨QQ项目,其中的通信部分用到了java中自带的InputStream,OutputStream,Writer,Reader等等,感觉其中的很大的一个问题就是难以将事务处理的逻辑层与解析层分离开来,造成整个项目看起来比较臃肿,繁琐,不够模块化,接触Mina后发现mina在这方面做的很是恰到好处. 看到文章标题,你或许会有一些疑惑: 1.Mina框架传递对象

Spring MVC传输对象属性

今天搬砖时遇到一个问题,前端使用JSP+form传输数据,后台使用Spring MVC接收,但是接收到的对象属性一直是null,找了好久才发现原因,代码如下 前端代码 后端代码 需要注意一点 User对象属性需要与表单中name属性中一致(不是id属性,之前接收到的一直为null就是由于只写了id,为预防错误最好id和name都写上且为同一值) 原文地址:https://www.cnblogs.com/lovetq520/p/11655750.html

Element-UI ( Dropdow )下拉菜单组件command传输对象

通过 :command绑定对象数据,handleCommand方法处理数据 template <div v-for="(item, index) in FlyWarningList" :key="index"> <div :class="[isActive === item.isRead ? '':' warning-content', 'first-content']" v-if="item.infoType ===