前言

之前的一篇文章是Netty简单的学习,我们可以传递一个字符串,那么如果我们想要在Netty中传递一个对象该怎么办呢 ?
那么这个时候我们可以结合Marshalling来传递。
方法如下:
首先需要导入两个Marshalling的依赖包
jboss-marshalling-1.3.0.CR9.jar jboss-marshalling-serial-1.3.0.CR9.jar
注意:我开始学习的时候只导入了第一个jar包,没有导入第二个,结果是不报错,但是客户端和服务端之间传递不了消息。所以两个包一定要都导入才行。
MarshallingCodeCFactory工具类
public class MarshallingCodeCFactory {
public static MarshallingDecoder buildMarshallingDecoder() {
final MarshallerFactory factory = Marshalling.getProvidedMarshallerFactory("serial");
final MarshallingConfiguration configuration = new MarshallingConfiguration();
configuration.setVersion(5);
UnmarshallerProvider provider = new DefaultUnmarshallerProvider(factory, configuration);
MarshallingDecoder decoder = new MarshallingDecoder(provider, 1024*1024);
return decoder;
}
public static MarshallingEncoder buildMarshallingEncoder() {
final MarshallerFactory factory = Marshalling.getProvidedMarshallerFactory("serial");
final MarshallingConfiguration configuration = new MarshallingConfiguration();
configuration.setVersion(5);
MarshallerProvider provider = new DefaultMarshallerProvider(factory, configuration);
MarshallingEncoder encoder = new MarshallingEncoder(provider);
return encoder;
}
}
server端
public class Server {
public static void main(String[] args) throws InterruptedException {
//1.第一个线程组是用于接收Client端连接的
EventLoopGroup bossGroup = new NioEventLoopGroup();
//2.第二个线程组是用于实际的业务处理的
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup);//绑定两个线程池
b.channel(NioServerSocketChannel.class);//指定NIO的模式,如果是客户端就是NioSocketChannel
b.option(ChannelOption.SO_BACKLOG, 1024);//TCP的缓冲区设置
b.option(ChannelOption.SO_SNDBUF, 32*1024);//设置发送缓冲的大小
b.option(ChannelOption.SO_RCVBUF, 32*1024);//设置接收缓冲区大小
b.option(ChannelOption.SO_KEEPALIVE, true);//保持连续
b.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel ch) throws Exception {
//设置Marshalling的编码和解码
ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());
ch.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());
ch.pipeline().addLast(new ServertHandler());
}
});
ChannelFuture future = b.bind(8765).sync();//绑定端口
future.channel().closeFuture().sync();//等待关闭(程序阻塞在这里等待客户端请求)
bossGroup.shutdownGracefully();//关闭线程
workerGroup.shutdownGracefully();//关闭线程
}
}
ServerHandler处理类
public class ServertHandler extends ChannelHandlerAdapter {
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
cause.printStackTrace();
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
throws Exception {
Send send = (Send) msg;
System.out.println("client发送:"+send);
Receive receive = new Receive();
receive.setId(send.getId());
receive.setMessage(send.getMessage());
receive.setName(send.getName());
ctx.writeAndFlush(receive);
}
}
由于我们已经在Server端和Client端定义了传递的类型又Marshalling工厂处理,所以此时我们接收的时候直接转成发送的对象类型就行了。
Client端
public class Client {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup worker = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
b.group(worker)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc) throws Exception {
//ByteBuf buf = Unpooled.copiedBuffer("$_".getBytes());
//sc.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,buf));
//sc.pipeline().addLast(new StringDecoder());
sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingDecoder());
sc.pipeline().addLast(MarshallingCodeCFactory.buildMarshallingEncoder());
sc.pipeline().addLast(new ClientHandler());
}
});
ChannelFuture f=b.connect("127.0.0.1",8765).sync();
for(int i=1;i<=5;i++){
Send send = new Send();
send.setId(i);
send.setMessage("message"+i);
send.setName("name"+i);
f.channel().writeAndFlush(send);
}
f.channel().closeFuture().sync();
worker.shutdownGracefully();
}
}
ClientHandler端
public class ClientHandler extends ChannelHandlerAdapter{
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
cause.printStackTrace();
ctx.close();
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
throws Exception {
Receive receive = (Receive) msg;
System.out.println("server反馈:"+receive);
}
}
send类
public class Send implements Serializable {
/**
* serialVersionUID:TODO(用一句话描述这个变量表示什么)
*
* @since 1.0.0
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String message;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "Send [id=" + id + ", name=" + name + ", message=" + message + "]";
}
}
Receive类
public class Receive implements Serializable{
/**
* serialVersionUID:TODO(用一句话描述这个变量表示什么)
* @since 1.0.0
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String message;
private byte[] sss;
public byte[] getSss() {
return sss;
}
public void setSss(byte[] sss) {
this.sss = sss;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "Receive [id=" + id + ", name=" + name + ", message=" + message + ", sss=" + Arrays.toString(sss) + "]";
}
}
注意:send类和receive这两个类,我们再真实环境开发的时候服务器和客户端往往是两个web应用程序,在这里我们要注意服务端和客户端之间的两个类类名和包名在两端要完全相同。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# netty
# marshalling
# 发送对象
# 发送数据
# Netty学习教程之基础使用篇
# 客户端
# 在这里
# 第一个
# 我们可以
# 第二个
# 句话
# 绑定
# 服务端
# 这两个
# 要注意
# 这个时候
# 这篇文章
# 才行
# 报错
# 谢谢大家
# 一篇文章
# 转成
# 完全相同
# 应用程序
# 方法如下
相关文章:
如何通过IIS搭建网站并配置访问权限?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站之星官网登录失败?如何快速解决?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何用景安虚拟主机手机版绑定域名建站?
建站之星Pro快速搭建教程:模板选择与功能配置指南
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
在线制作视频网站免费,都有哪些好的动漫网站?
高防服务器租用指南:配置选择与快速部署攻略
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
建站主机如何选?性能与价格怎样平衡?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
如何用狗爹虚拟主机快速搭建网站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何配置支付宝与微信支付功能?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
建站之星如何实现PC+手机+微信网站五合一建站?
建站之星收费标准详解:套餐费用及年费价格表一览
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
网站制作知乎推荐,想做自己的网站用什么工具比较好?
如何用已有域名快速搭建网站?
c# 服务器GC和工作站GC的区别和设置
如何选择服务器才能高效搭建专属网站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
建站之星如何实现网站加密操作?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
,sp开头的版面叫什么?
,怎么用自己头像做动态表情包?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
,如何利用word制作宣传手册?
建站VPS选购需注意哪些关键参数?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何在橙子建站上传落地页?操作指南详解
黑客如何利用漏洞与弱口令入侵网站服务器?
广东企业建站网站优化与SEO营销核心策略指南
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
h5在线制作网站电脑版下载,h5网页制作软件?
如何用wdcp快速搭建高效网站?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
网站制作公司,橙子建站是合法的吗?
青岛网站建设如何选择本地服务器?
动图在线制作网站有哪些,滑动动图图集怎么做?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
如何快速生成橙子建站落地页链接?
网页设计网站制作软件,microsoft office哪个可以创建网页?
建站之星如何配置系统实现高效建站?
*请认真填写需求信息,我们会在24小时内与您取得联系。