首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java网络编程之Netty实战数据通信(七)

1 分析

我们需要了解下在真正项目应用中如何去考虚Netty的使用,大体上对于一参数设置都是根据服务器性能决定的。这个不是最主要的。

我们要考虑的问题是两台机器(甚至多台)使用Netty的怎样进行通信,我把他分为三种:

第一种,使用长连接通道不断开的形式进行通信,也就是服务器和客户端的通道一直处于开启状态,如果服务器性能足够好,并且我们的客户端数量也比较少的情况下,我还是推荐这种方式的。

第二种,一次性批量提交数据,采用短连接方式。也就是我们会把数据保存在本地临时缓冲区或者临时表里,当达到临界值时进行一次性批量提交。又或者根据定时任务轮询提交,这种情况弊端是做不到实时性传输,在对实时性不高的应用程序中可以推荐使用。

第三种,我们可以使用一种特殊的长连接,在指定某一时间之内,服务器与某台客户端没有任何通信,则断开连接。下次连接则是客户端向服务器发送请求的时候,再次立连接。但是这种模式我们要考虑2个因素:

1、如何在超时(即服务器和客户端没有任何通信)后关闭通道?关闭通道后我们又如何再次建立连接?

2、客户端宕机时,我们无需考虑,下次客户端重启之后我们就可以与服务器建立连接,但是服务器宕机时,我们的客户端如何与服务器进行连接呢?

好到这这三种场景都描述了一个遍,再简单的来说一下。第一种,主要你的服务器性能够好,ok你可以采取第一种完全没问题;第二种,感觉也没什么毛病,但是做不到实时性;第三种,个人强烈建议使用第三种,我会用一个小小案例来说明,需要考虑的因素,等我把案例讲完了也许你就懂如何解决了,当然如果你会了第三个,第一个也就不算什么难事了,就相当于我们刚开始学的HelloWorld案例一样,好说了那么多废话,在这就不BB了,直接上案例,注意这里只拿第三种来说明:

2 案例

在讲解案例之前先说一下,这个案例用到JBoss Marshalling编解码框架,不了解编解码技术的可以看我上一篇文章。说实话,如果你看过上一篇文章,这个案例就相当于上一篇文章的更改版,只是在客户端这里做了一些修改。

需要的jar包有 1、netty 2、log4j 3、jboss-marshalling jboss-marshalling-serial 需要jar包的可以去我的github下载或者自己去官网下载。https://github.com/hfbin/Thread_Socket/tree/master/Socket/runtime/jar%E5%8C%85

还是老规矩有实体类先上实体类

2.1 实体类

首先,需要两个实体类,实体类都需要实现Serializable接口,Request类是用来做客户端的请求的, Response类是用来做服务端返回给客户端的响应。

Request ```javapublic class Request implements Serializable{

}

javapublic class Response implements Serializable{

}

java

public final class MarshallingCodeCFactory {

}

javapublic class Server {

}

javapublic class ServerHandler extends ChannelHandlerAdapter{

}

javapublic class Client {

}

javapublic class ClientHandler extends ChannelHandlerAdapter{

}```

这里很简单,没什么好说的了。

好!到这目前所有代码都编写完了来测试一下效果。

服务端启动打印如图:

客户端启动打印如图:

客户端启动后服务端的打印:

这里只看几张照片是看不出什么效果的,建议下载源码,自己测试,注意看打印结果。

好代码说完了,运行结果也看了,刚刚留的两个问题现在可以说一下了,为了大家方便我重新说一下要解决的两个问题。

1、如何在超时(即服务器和客户端没有任何通信)后关闭通道?关闭通道后我们又如何再次建立连接?

2、客户端宕机时,我们无需考虑,下次客户端重启之后我们就可以与服务器建立连接,但是服务器宕机时,我们的客户端如何与服务器进行连接呢?

第一个问题,相信大家都知道如何解决的了,在客户端跟服务端都使用了Netty提供的超时方法ReadTimeoutHandler(5),参数是以秒来算的。关闭通道后我们重新启动一个线程调用getChannelFuture()方法。重新连接。

第二个问题,首先我们肯定的是在liunx环境下做部署的,我们可以在liunx下编写启动服务端的脚本(.sh),要是服务端真出问题只需要启动脚本就可以启动服务器了。

好!到这这个案例就讲解完了,下一篇文章是Netty实战的第二个使用场景。

源代码:https://github.com/hfbin/Thread_Socket/tree/master/Socket/runtime

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180210G12ERD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券