Netty-SocketIO:最好用的Java版即时消息推送(1)

简介: Netty-SocketIO:最好用的Java版即时消息推送

Netty-SocketIO是一个开源的、基于Netty的、Java版的即时消息推送项目。通过Netty-SocketIO,我们可以轻松的实现服务端主动向客户端推送消息的场景,比如说股票价格变化、K线图、消息提醒等。它和websocket有相同的作用,只不过Netty-SocketIO可支持所有的浏览器。


GitHub项目地址为: https://github.com/mrniko/netty-socketio


Socket.IO除了支持WebSocket通讯协议外,还支持许多种轮询(Polling)机制以及其它实时通信方式,并封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。Socket.IO实现的Polling通信机制包括Adobe Flash Socket、AJAX长轮询、AJAX multipart streaming、持久Iframe、JSONP轮询等。Socket.IO能够根据浏览器对通讯机制的支持情况自动地选择最佳的方式来实现网络实时应用。


###一、下载Netty-SocketIO


socket.io-client-master

netty-socketio-master

netty-socketio-demo-master

从netty-socketio的git上可下载到以上三个压缩包,分别对应的是web 客户端的所需文件、netty socketio的java服务端实现、以及对应的可以应用web推送的demo。


###二、部署server的资源项目

从git上下载的socketio server压缩包中没有项目所需的jar包,我是自己新建了一个项目,本来上传到了CSDN的代码库里了,但写博客的时候怎么也打不开了,那么只能提供对应项目导航图,同时提供jar包的下载地址,需要的可动手去获得。

image.png



http://mvnrepository.com/网站上课下载到需要的所有jar包。


然后将jar包添加到项目中。

切记jdk的版本一定要在1.7以上,我在本地环境中用的1.7,但是服务器上一直用的是1.6,部署项目的时候没有注意,导致服务端可以接收到客户端的socketio 的connect,但是客户端的response相应中却连接不通,开始的时候以为是跨域问题导致的,搜了好多帖子,但问题根本就是不是跨域引起的,jdk的版本换成1.7就ok了,因为netty的nio是基于java的1.7的。


###三、应用server

在需要应用socketio的项目上右键,为项目添加socketio项目支持(注意红色标出的)。

image.png


新建main类。

public static void main(String[] args) throws InterruptedException {
  Configuration config = new Configuration();
  config.setHostname("localhost");
  config.setPort(10015);
  SocketIOServer server = new SocketIOServer(config);
  server.addConnectListener(new ConnectListener() {// 添加客户端连接监听器
    @Override
    public void onConnect(SocketIOClient client) {
      logger.info(client.getRemoteAddress() + " web客户端接入");
      client.sendEvent("helloPush", "hello");
    }
  });
          // 握手请求
  server.addEventListener("helloevent", HelloUid.class, new DataListener<HelloUid>() {
    @Override
    public void onData(final SocketIOClient client, HelloUid data, AckRequest ackRequest) {
      // 握手
      if (data.getMessage().equals("hello")) {
        int userid = data.getUid();
        logger.info(Thread.currentThread().getName() + "web读取到的userid:" + userid);
        // send message back to client with ack callback
        // WITH data
        client.sendEvent("hellopush", new AckCallback<String>(String.class) {
          @Override
          public void onSuccess(String result) {
            logger.info("ack from client: " + client.getSessionId() + " data: " + result);
          }
        }, sessionTime);
      } else {
        logger.info("行情接收到了不应该有的web客户端请求1111...");
      }
    }
  });
        server.start();
        Thread.sleep(Integer.MAX_VALUE);
        server.stop();
    }


当client通过ip和端口连接到server后,会构造一个SocketIOClient client的对象,在实际的应用中,可以将该client保存起来,通过client.sendEvent("helloPush", "hello");就可以向client端发送相应的数据了。


###四、应用client

####①、引入socket.io.js


<script type="text/javascript" src="${ctx}/components/socketio/socket.io.js"></script>


####②、创建connection的公共方法

function connectQuotation(uid, callback) {
  // 链接行情server
  socket = io.connect('http://localhost:10015');
  // 如果用户在web端登陆,那么发送握手请求
  if (uid) {
    // 连接上server后
    socket.on('connect', function() {
      // 发送握手请求
      var jsonObject = {
        uid : parseInt(uid),
        message : "hello"
      };
      this.emit('helloevent', jsonObject);
      this.on('hellopush', function(data, ackServerCallback, arg1) {
        // base64转码的数据,可忽视
        YUNM.session = {
          sessionId : $.base64.atob(data.sessionId),
          time : $.base64.atob(data.time)
        };
        if (ackServerCallback) {
          ackServerCallback('server message was delivered to client!');
        }
      });
    });
  }
  // 如果web端session超时,socket断开,10分钟扫描一次
  int = window.setInterval(function() {
    // 我是通过ajax判断session超时的,你也可以通过其他方式
    $.ajax({
      type : 'POST',
      url : common.ctx + "/getSessionTimeout",
      dataType : "json",
      cache : false,
      success : function(json) {
        var timeout = parseInt(json.message);
        // session超时后,socket断开,服务端就可以监听到释放资源
        if (timeout == 0) {
          socket.disconnect();
        }
      },
      error : function() {
        socket.disconnect();
        // 清除
        window.clearInterval(int);
      }
    });
  }, YUNM._set.interval);
  callback();
}


####③、需要web推送的页面进行socketio的连接


$(function() {
connectQuotation($("#global_uid").val(), function() {
  socket.on("pushQuotation", function(message) {
  if (message.type == "dealOrder") {
    var msg = message.response.result;
    // 输出服务端消息
    YUNM.debug(msg);
  }
  });
});
});


相关文章
|
Java 微服务
Java报告推送失败补偿机制;钉钉群通知消息核心代码
Java报告推送失败补偿机制,超过次数后使用钉钉通知开发 自动补偿实现: 要求方法调用的过程中,失败的时候,系统有办法进行自动重试,重试达到一定次数后,钉钉通知开发。 实现设计:注解,反射,定时任务
255 0
Java报告推送失败补偿机制;钉钉群通知消息核心代码
|
Java Docker 容器
《阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库》电子版地址
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库
216 0
《阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库》电子版地址
|
Java
全网首发:OPPO推送:服务器端的参考代码,JAVA版
全网首发:OPPO推送:服务器端的参考代码,JAVA版
287 0
|
Web App开发 前端开发 Java
Netty-SocketIO:最好用的Java版即时消息推送
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/52525677 Netty-SocketIO是一个开源的、基于Netty的、Java版的即时消息推送项目。
6687 1
|
机器人 Java
Java后台推送告警信息到钉钉
Java后台推送告警信息到钉钉的实现
621 0
Java后台推送告警信息到钉钉
|
机器学习/深度学习 Java 应用服务中间件
Netty-SocketIO:最好用的Java版即时消息推送(2)
Netty-SocketIO:最好用的Java版即时消息推送
1030 0
|
Java
全网首发:OPPO推送:服务器端的参考代码,JAVA版
近来调试OPPO推送,服务器没有参考代码,简直让人崩溃。于是反复测试,排列组合,找到了正确的办法。也许有朋友也会遇到类似问题,所以在这里把代码共享出来。节省时间不说,最主要心情好一些。
270 0
|
Java Maven Docker
Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库
大规模集群快速部署Java应用,需要制作Docker镜像,本次课程详细介绍如何制作Java程序的Docker镜像文件,深入解析DockerFile核心参数,以及实践演练把我们制作的Docker镜像推送到DockerHub仓库,国内可以使用阿里云Docker仓库加速,以及安全保护机制。
8866 0
|
网络协议 Java API
Java新人必学课程,Java进阶学习全路线(内涵Java超级干货推送及专家社群福利)
自从拉了java社群之后,发现经常有一些新手java开发在吐槽,吐槽java不知道从何学起,感觉路很迷惘。其实小编想说,沉下心,你会发现要走的路并不是很难。为了帮助新人更好的成长,小编特意邀请了最课程的陆敏技老师来给大家进行java基础课程直播分享。
19028 0