假设面试官问你:要把server端的数据时时显示在浏览器上怎么实现?我想有非常多人会回答使用Ajax技术定时去訪问一个资源,没错,使用Ajax的确能实现。但面试官要的绝对不是这个答案。

由于使用Ajax频繁訪问给服务端造成太大的压力,所以在大部分情况下都是不取的。面试官想要的答案应该是将server端的数据推送至浏览器,这样仅仅须要保持一个长链接就能够了。

socket.io就能实现数据的时时推送,socket.io(官网:http://socket.io/)是一个跨平台。多种连接方式自己主动切换时时引擎。要说明的是,socket.io.js仅仅能完毕client功能,还须要server端的实现才干真正完毕数据的推送。socket.io官方给出的样例服务端使用node.js实现,我想还有非常多人对node.js是陌生的(me

too)。

socket.io服务端实现能够有多种语言,应该说仅仅要能支持socket协议就能够。

以下的样例将给出两个java语言的服务端实现及其使用演示样例。演示样例内容非常easy,就是在服务端随机产生一个坐标(包括x,y值),然后将其推送至浏览器并显示。我想会推送一个坐标值,推送其他数据应该也不是问题。

第一种实现、netty-socketio,坐标为:com.corundumstudio.socketio:netty-socketio:1.7.3(gradle)。假设使用的是maven。则坐标为:

com.corundumstudio.socketio

netty-socketio

1.7.3a.服务端代码:

public class Server {

private static List clients = new ArrayList();//用于保存全部客户端

public static void main(String[] args) throws Exception {

Configuration configuration = new Configuration();

configuration.setHostname("127.0.0.1");//设置主机名

configuration.setPort(8082);//设置监听的port号

SocketIOServer server = new SocketIOServer(configuration);//依据配置创建服务器对象

server.addConnectListener(new ConnectListener() {//加入客户端连接监听器

@Override

public void onConnect(SocketIOClient client) {

System.out.println("connected:SessionId=" + client.getSessionId());

clients.add(client);//保存客户端

}

});

server.start();

System.out.println("server started");

Timer timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

Random random = new Random();

for(SocketIOClient client : clients) {

client.sendEvent("pushpoint", new Point(random.nextInt(100), random.nextInt(100)));//每隔一秒推送一次

}

}

}, 1000, 1000);

Object object = new Object();

synchronized (object) {

object.wait();

}

}

}

b.Point类:

public class Point {

private int x;

private int y;

public Point(int x, int y) {

this.x = x;

this.y = y;

}

//getter,setter

}c.html页面:

netty-socketio測试

$(function(){

var socket = io.connect('http://127.0.0.1:8082');

//监听名为pushpoint的事件,这与服务端推送的那个事件名称必须一致

socket.on("pushpoint", function(data){

$('#x').text(data.x);

$('#y').text(data.y);

});

});

x=0, y=0

另外一种实现、socketio-netty(上面一个是netty-socketio),这个实如今maven中央库中好像还没有,该项目托管在google code上,项目地址为:http://code.google.com/p/socketio-netty/。本人是把它下载下来后手动安装在私服上的。现已上传至:http://download.csdn.net/detail/xtayfjpk/9720229,可供下载。

a.服务端代码:

public class Server2 {

private static List clients = new ArrayList();

public static void main(String[] args) throws Exception {

SocketIOServer ioServer = new SocketIOServer(new IOHandlerAbs() {

@Override

public void OnShutdown() {

System.out.println("shut down");

}

@Override

public void OnMessage(IOClient client, String eventName) {

System.out.println("receive message,eventName=" + eventName);

}

@Override

public void OnDisconnect(IOClient client) {

System.out.println("disconnect");

System.out.println("disconnect");

}

@Override

public void OnConnect(IOClient client) {

System.out.println("connect");

clients.add(client);

}

}, 8088);

ioServer.start();

System.out.println("server started");

Timer timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

Random random = new Random();

String data = "{\"x\":" +random.nextInt(100)+ ",\"y\":" +random.nextInt(100)+ "}";

BASE64Encoder encoder = new BASE64Encoder();

data = encoder.encode(data.getBytes());

for(IOClient client : clients) {

client.send(formatMessage(data));

}

}

}, 1000, 1000);

Object object = new Object();

synchronized (object) {

object.wait();

}

}

private static String formatMessage(String data) {

return String.format(

"5:::{\"%s\":\"%s\",\"%s\":[\"%s\"]}",//socket.io字符串格式

"name",

"push",//事件名称

"args",

data//携带的数据

);

}

}

须要说明的是。该实现不能像上一个实现一样发送一个对象,仅仅能发送一个字符串,并且该字符串中还不能包括双引號(或许还有其他特殊字符)。

而推送过程中我们使用的数据格式非常可能是JSON。那就肯定有双引號,所以这里採取的办法是对要发送的数据进行BASE64编码。然后在client解码回来得到我们想要的数据。

b.html页面:

socketio-netty測试

$(function(){

var host = "http://127.0.0.1:8088";

var socket = null;

if(/MSIE (\d+.\d+);/.test(navigator.userAgent)){

if(/MSIE 10(.\d+);/.test(navigator.userAgent)){

socket = io.connect(host);

}else{

socket = io.connect(host,{transports:['jsonp-polling']});

}

} else {

socket = io.connect(host,{transports:['websocket','flashsocket','htmlfile','xhr-polling','jsonp-polling']});

}

socket.on("push", function(data){

var words = CryptoJS.enc.Base64.parse(data);

var point = CryptoJS.enc.Utf8.stringify(words);

point = JSON.parse(point);

$('#x').text(point.x);

$('#y').text(point.y);

});

});

x=0, y=0

第一个样例中实现的socket.io版本号为1.0.6。第二个使用的版本号为0.9.6。这两种服务端实现都是基于netty框架的,但个人认为还是第一种实现比較好用,省去了编码的过程,并且封装程度更高。

演示样例代码project已托管在GitHub中,使用gradle进行构建,地址为:https://github.com/xtayfjpk/socketio-test。

仅仅要将其捡出就可以执行。

socketio mysql_socketio server推送相关推荐

  1. spring boot 集成socketIo 做消息推送

    spring boot 集成socketIo 做消息推送 项目需求 代码展示 客户端代码 服务端代码 项目需求 后台管理系统用户小铃铛,消息推送功能并展示有多少条消息或者小红点 代码展示 客户端代码 ...

  2. Android推送进阶课程学习笔记

    今天在慕课网学习了Android进阶课程推送的server端处理回执的消息 . 这集课程主要介绍了,当server往client推送消息的时候,client须要发送一个回执回来确认收到了推送消息才算一 ...

  3. Webserver推送技术

    server推送(Server Push) 推送技术的基础思想是将浏览器主动查询信息改为server主动发送信息.server发送一批数据,浏览器显示这些数据,同一时候保证与server的连接.当se ...

  4. iOS 推送通知及推送扩展

    概述 iOS中的通知包括本地推送通知和远程推送通知,两者在iOS系统中都可以通过弹出横幅的形式来提醒用户,点击横幅会打开应用.在iOS 10及之后版本的系统中,还支持通知扩展功能(UNNotifica ...

  5. java集成jpush实现客户端推送

    代码地址如下: http://www.demodashi.com/demo/13700.html 前言 java 集成jpush 实现客户端推送 ###一.准备工作 开发环境: jdk1.6 Ecli ...

  6. 【PWA】web推送技术

    伴随着今年 Google I/O 大会的召开,一个很火的概念–Progressive Web Apps 诞生了.这代表着我们 web 端有了和原生 APP 媲美的能力.但是,有一个很重要的痛点,web ...

  7. iOS 推送证书的制作

    关于iOS推送证书的P12文件,并不是直接从KeyChain导出来的证书文件,而是需要经过openSSL工具制作的.(好在Mac OS 默认就有openSSL命令) 针对不同的Server平台,需要的 ...

  8. SQL数据库推送至MySQL_SQL 2000怎么向SQL 2008 R2推送数据?

    最近做的一个项目要获取存在于其他服务器的一些数据,为了安全起见,采用由其他服务器向我们服务器推送的方式实现.我们服务器使用的是sql server 2008 R2,其他服务器使用的都是SQL Serv ...

  9. flask+socketio+echarts3 服务器监控程序(基于后端数据推送)

    本文地址:http://www.cnblogs.com/hhh5460/p/7397006.html 说明 以前的那个例子的思路是后端监控数据存入数据库:前端ajax定时查询数据库. 这几天在看web ...

最新文章

  1. 设计MM32-LINK自动复位器,上电复位
  2. 解决vue版本不匹配的问题 Vue packages version mismatch:
  3. 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
  4. JRE里居然隐藏了一个自带的js engine
  5. amazon php 空间,(四)Amazon Lightsail 部署LAMP应用程序之扩展PHP前端
  6. [ARM] [linux master] 调试技术002 在linux下面使用mtrace来检查一般程序的内存溢出
  7. python matplotlib 播放图片变化过程
  8. @程序员,这些编程陷阱你中招了吗?
  9. [转载] [python3教程]第七章.输入输出(Input and Output)
  10. Harris角点检测算法 1
  11. 操作系统思考 第五章 更多的位与字节
  12. 关于CefSharp在客户端运行报错的解决方案
  13. AD17 保存PCB文件时提示失败
  14. iphone11屏比例_iphone11屏幕尺寸 而不是直接的长或者宽所以是算
  15. tezos multisig baker
  16. python注释多行
  17. linux系统下载及安装(CentOS-7-x86_64-DVD-1810.iso)
  18. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比
  19. 服装行业采购商城系统平台采购招标透明化,提高采购管理水平
  20. 软考高级项目管理师每日必记

热门文章

  1. 用html怎么制作风车,用css3实现风车效果_html/css_WEB-ITnose
  2. db2 随机数函数_db2产生随机数
  3. ctf/web源码泄露及利用办法【总结中】
  4. OpenGL 之 齐次坐标
  5. 歌词迷惑大赏:这些年我们都听了什么!!!
  6. laravel6中使用广播推送消息
  7. 我国水土流失面积有所减少,水土保持监管能力和现代化水平也显著提升[图]
  8. 小红书22届校招薪资待遇怎么样?值得进吗?
  9. 玩转算法面试:(四)LeetCode查找类问题
  10. AutoSAR系列讲解(实践篇)7.5-OS原理进阶(上)