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再次连接,然后进行通信,最后等待超时,断开连接。

  • 相关阅读:
    nginx $remote_addr 详解
    Alipay SDK验签PHP低于5.5版本错误
    Alipay支付宝调用错误:Call to undefined function openssl_sign()
    nginx.conf 下日志host.access.log 说明
    vim全选,全部复制,全部删除
    jquery 获取上传文件大小
    linux网络配置
    crontab 定时任务简单备份数据库
    linux进程管理
    mysql 动态增加列,查找表中有多少列,具体什么列。 通过JSON生成mysql表 支持子JSON
  • 原文地址:https://www.cnblogs.com/shmilyToHu/p/7156617.html
Copyright © 2011-2022 走看看