zoukankan      html  css  js  c++  java
  • Netty实践一(数据通信)

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

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

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

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

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

      (1)如何在超时(即服务器和客户端每天任何通信)后关闭通道?关闭通道后,又如何再次建立连接?

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

    下面我们看一下第三种方式的实现:

    先看一下最原始的长连接:

    主要有这几个类,

    其他几个类和前面的都差不多,最主要的是Client类,下面看一下Client类

    顺便看一下Server和ServerHandler的代码:

     

    这边在Server端没有添加listener,所以在运行的时候,应该是一直保持着链接,

    看一下运行结果:

    可以看的出来,这个是保持着长连接的,下面看一下如何实现在指定的时间,没有通信,就断开链接,

    Netty提供了一种超时的设置,即在指定时间内,没有通信的话,就断开连接,

    下面看一下实现,只需在SocketChannel 中,添加超时的配置即可:

    在Client和Server中,都添加这段代码,这边是指超过5s中没有通信则关闭连接,

    同时,我们将Client中的for循环的sleep的时间修改一下,

    看一下打印的结果

     

    在指定的时间内,C/S之间没有进行通信,则断开连接,

    但是当有新的请求时,要如何再次进行连接,然后通信呢?

    看一下,下面在刚刚的代码后面,新建一个子线程:

    这里要注意,前面的Client的连接已经断开了,需要通过一个判断去判断,有没有连接,没有连接则去获取连接,看一下判断的语句:

    那cf什么时候会是null呢?

     null指的是指第一次调用connect的时候,去创建cf对象。

    通过这两个判断,可以解决重连问题,下面看一下运行的结果:

    可以看的出来,前两条数据是在主线程里面进行的通信,然后连接断开,等待几秒后,子线程获取连接,和server再次连接,然后进行通信,最后等待超时,断开连接。

  • 相关阅读:
    HDU 1874 畅通工程续 (Dijkstra , Floyd , SPFA, Bellman_Ford 四种算法)
    HDU Wooden Sticks
    HDU 3664 Permutation Counting
    javascript DOM添加元素,使用节点属性
    SQL server查询数据类型为ntext是空或NULL值
    TSQL Pivot Tables(行列转换) in SQL Server 2005/2008
    ASP.NET 3.5(c#)区域化设置(LCID)
    Sql 脚本导入EXCEL数据
    asp.net 3.5 csharp 实现事务
    asp.net3.5 csharp: How to show HTML content in calendar tooltip?
  • 原文地址:https://www.cnblogs.com/shmilyToHu/p/7156617.html
Copyright © 2011-2022 走看看