- 浏览: 358882 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
liulehua_123:
...
使用netty+spring搭建游戏框架 -
heng123:
netty等视频java.5d6b.com教程
使用netty+spring搭建游戏框架 -
di1984HIT:
、
redis 主从同步配置方案 -
di1984HIT:
学习了~~
使用netty+spring搭建游戏框架 -
di1984HIT:
不错,学习了~~
征服flume之三——使用log4j输出日志到flume
基于jquery mobile+websocket+protocol buffer的IM开发
- 博客分类:
- java编程
第一次研究有关web端的框架,结合工作需要,决定搞一个基于websocket+protobuffer的聊天demo。闲话少叙,上干货!
关于jquery mobile
jQuery Mobile 是用于创建移动 Web 应用的前端开发框架。
jQuery Mobile 可以应用于智能手机与平板电脑。
jQuery Mobile 使用 HTML5 & CSS3 最小的脚本来布局网页。
jquery mobile官网
作为移动web前端开发框架,是否有比jquery mobile更合适的框架,请各路大神指点!
关于websocket
WebSocket protocol 是HTML5的协议。它实现了浏览器与服务器全双工通信(full-duplex)。
关于websocket相关的资料网上有很多,在此不做过多叙述。
基于netty的websocket开发,请参见之前的博客
关于protocol buffer
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了三种语言的实现:java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
基于protocol buffer的开发,js和java都有相关开源的库可以直接调用,下文将详述。
--------------------------------华丽分割线--------------------------------
以下是代码部分!
前端
一、websoocket链接服务器
这里要注意的是 ws.binaryType = "arraybuffer";也就是说这里采用的是arraybuffer方式与服务器端通信。如果不填写通信方式,返回的数据类型是Blob,解析时会很麻烦。
二、protocol buffer消息构建与发送
js提供了开源的protobuf类库 protobuf.min.js 可以直接使用。
由于使用arrayBuffer方式,还需要引用bytebuffer.min.js、ByteArray.js、long.min.js几个类库。当然基础的jquey库也是不可少的(附件中提供下载)。
首先我们需要准备proto文件(即protocol buffer通信的协议文件)
required 必填字段
optional 选填字段
repeated 可重复字段
enum 枚举
这里需要注意的是,java服务器端支持package路径,而js客户端解析proto文件时不要带package路径。
1、我们使用的消息格式是
2、构建protocol buffer对象时,可以先构建key:value键值对{key1:value1,key2:value2},构建对象时将值传入即可。
3、这里为了方式socket通信是黏包,在发送的arrayBuffer前加入了一个int的包长度。
返回消息的处理
1、返回的消息仍然在首位添加了包长度字段
2、返回的消息格式是
三、jquery mobile的使用
1、开发移动web页面一定要注意添加meta头
viewport的content相关解释
width
Width of the viewport in pixels (or device-width). If width isn’t set, it defaults to a desktop size (980px on mobile Safari).
height
Height of the viewport in pixels (or device-height). Generally you don’t need to worry about setting this property.
initial-scale
(0 to 10.0) Multiplier that sets the scale of the page after its initial display. Safe bet: if you need to set it, set it to 1.0. Larger values = zoomed in, smaller values = zoomed out
minimum-scale
(0 to 10.0) The minimum multiplier the user can “zoom out” to. Defaults to 0.25 on mobile Safari.
maximum-scale
(0 to 10.0) The minimum multiplier the user can “zoom in” to. Defaults to 1.6 on mobile Safari.
user-scalable
(yes/no) Whether to allow a user from scaling in/out (zooming in/out). Default to “yes” on mobile Safari.
2、jquery mobile使用过程中主要遇到个问题,跳转到新页面后js脚本未初始化(jquery mobile内部使用ajax方式请求,脚本放在head中不会被加载),我的解决方法是将js脚本放到<div data-role="page">内。当然还有其他方式,比如在a标签中设置 data-ajax=“false”属性,看自己的需求喽!
3、由于使用jquery mobile只用了一些皮毛,所以遇到的问题并不多,具体的使用细节可以参考官网,推荐一篇文库文章
四、服务器端开发
由于我们服务器端的架构相对复杂,这里不做具体阐述,有兴趣的同学可以看我之前的博客
需要注意的是在eclipse环境下需要安装protocol buffer的插件,很不幸的是在我天朝上国安装这个插件是相对麻烦的 http://protobuf-dt.googlecode.com/git/update-site,因为……
不过苦日子马上就过去了!!!
关于jquery mobile
jQuery Mobile 是用于创建移动 Web 应用的前端开发框架。
jQuery Mobile 可以应用于智能手机与平板电脑。
jQuery Mobile 使用 HTML5 & CSS3 最小的脚本来布局网页。
jquery mobile官网
作为移动web前端开发框架,是否有比jquery mobile更合适的框架,请各路大神指点!
关于websocket
WebSocket protocol 是HTML5的协议。它实现了浏览器与服务器全双工通信(full-duplex)。
关于websocket相关的资料网上有很多,在此不做过多叙述。
基于netty的websocket开发,请参见之前的博客
关于protocol buffer
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了三种语言的实现:java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
基于protocol buffer的开发,js和java都有相关开源的库可以直接调用,下文将详述。
--------------------------------华丽分割线--------------------------------
以下是代码部分!
前端
一、websoocket链接服务器
ws = new WebSocket(url); ws.onopen = function(evt) { onOpen(evt); }; ws.onclose = function(evt) { onClose(evt) }; ws.onmessage = function(evt) { onMessage(evt) }; ws.onerror = function(evt) { onError(evt) }; ws.binaryType = "arraybuffer";
这里要注意的是 ws.binaryType = "arraybuffer";也就是说这里采用的是arraybuffer方式与服务器端通信。如果不填写通信方式,返回的数据类型是Blob,解析时会很麻烦。
二、protocol buffer消息构建与发送
js提供了开源的protobuf类库 protobuf.min.js 可以直接使用。
由于使用arrayBuffer方式,还需要引用bytebuffer.min.js、ByteArray.js、long.min.js几个类库。当然基础的jquey库也是不可少的(附件中提供下载)。
首先我们需要准备proto文件(即protocol buffer通信的协议文件)
message RequestMessage{ required RequestType requestType=1[default = CLIENT_TO_LOGIN]; enum RequestType { CLIENT_REGISTER=0; CLIENT_TO_LOGIN=1; CLIENT_TO_GAME=2; CLIENT_TO_IMSERVER=3; } required string gameId=2; required string serverId=3; required string ticket=4; optional Command message=5; } message Command{ required int32 commandId=1[default=-1]; optional bytes message=2; }
required 必填字段
optional 选填字段
repeated 可重复字段
enum 枚举
这里需要注意的是,java服务器端支持package路径,而js客户端解析proto文件时不要带package路径。
// 消息发送 function sendRequest(command) { if (typeof dcodeIO === 'undefined' || !dcodeIO.ProtoBuf) { throw (new Error( "ProtoBuf.js is not present. Please see www/index.html for manual setup instructions.")); } if (ws == null) { throw (new Error("sendMessage error !off_line")); } var ProtoBuf = dcodeIO.ProtoBuf; if (RequestMessage == null) { RequestMessage = ProtoBuf.loadProtoFile("protoBuf/Message.proto") .build("RequestMessage"); } var obj; if (command != null) { obj = { requestType : 0, gameId : gameId, serverId : serverId, ticket : registerValue, message : command }; } else { obj = { requestType : 0, gameId : gameId, serverId : serverId, ticket : registerValue }; } var request = new RequestMessage(obj); var msgArray = request.toArrayBuffer(); var content = new ByteArray(msgArray); var buffer = new ByteArray(); buffer.writeInt(msgArray.byteLength); buffer.writeBytes(content); ws.send(buffer.data); } //消息构建 function createCommand(commandId, sendMsg) { if (typeof dcodeIO === 'undefined' || !dcodeIO.ProtoBuf) { throw (new Error( "ProtoBuf.js is not present. Please see www/index.html for manual setup instructions.")); } if (ws == null) { throw (new Error("sendMessage error !off_line")); } var ProtoBuf = dcodeIO.ProtoBuf; var Message = ProtoBuf.loadProtoFile("protoBuf/CommandMessage.proto") .build("request_" + commandId); var request_obj; var request_data; switch (commandId) { case 12000: request_obj = { groupId : groupId, fromuid : registerValue, message : sendMsg, msgType : 0, nickname : nickName, faceIndex : 11 }; request_data = new Message({ message : obj }); break; case 10000: break; } if (CommandMessage == null) { CommandMessage = ProtoBuf .loadProtoFile("protoBuf/CommandMessage.proto") .build("Commond"); } var obj = { commandId : commandId, message : request_data.toArrayBuffer() }; var command = new CommandMessage(obj); return command; }
1、我们使用的消息格式是
requestMessage{ command{ request_command{ …… } } }
2、构建protocol buffer对象时,可以先构建key:value键值对{key1:value1,key2:value2},构建对象时将值传入即可。
3、这里为了方式socket通信是黏包,在发送的arrayBuffer前加入了一个int的包长度。
返回消息的处理
// 返回消息处理 function parseResponseMsg(receiveMsg) { var command = response(receiveMsg); var commandID = command.commandId; var ProtoBuf = dcodeIO.ProtoBuf; var message = ProtoBuf.loadProtoFile("protoBuf/CommandMessage.proto") .build("response_" + commandID); switch(commandID){ case sendMsg_protocolID: var data = message.decode(command.message); if (data.result == response_statue_ok) { console.log("发送广播消息成功"); } else { console.log("发送广播消息失败"); } break; case getWorldMsg_protocolID: var data = message.decode(command.message); addMsgItemOnScreen(data.message); console.log("收到其他广播消息:" + data.message.message); break; } } // 消息响应 function response(receiveMsg) { var tempBuffer = new ByteArray(); tempBuffer._writeUint8Array(new Uint8Array(receiveMsg)); tempBuffer.position = 0; var msgBuffer = new ByteArray(); tempBuffer.readBytes(msgBuffer, 4); var ProtoBuf = dcodeIO.ProtoBuf; var CommandMessage = ProtoBuf .loadProtoFile("protoBuf/CommandMessage.proto").build("Commond"); var command = CommandMessage.decode(msgBuffer.buffer); return command; }
1、返回的消息仍然在首位添加了包长度字段
2、返回的消息格式是
command{ response_command{ …… } }
三、jquery mobile的使用
1、开发移动web页面一定要注意添加meta头
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
viewport的content相关解释
width
Width of the viewport in pixels (or device-width). If width isn’t set, it defaults to a desktop size (980px on mobile Safari).
height
Height of the viewport in pixels (or device-height). Generally you don’t need to worry about setting this property.
initial-scale
(0 to 10.0) Multiplier that sets the scale of the page after its initial display. Safe bet: if you need to set it, set it to 1.0. Larger values = zoomed in, smaller values = zoomed out
minimum-scale
(0 to 10.0) The minimum multiplier the user can “zoom out” to. Defaults to 0.25 on mobile Safari.
maximum-scale
(0 to 10.0) The minimum multiplier the user can “zoom in” to. Defaults to 1.6 on mobile Safari.
user-scalable
(yes/no) Whether to allow a user from scaling in/out (zooming in/out). Default to “yes” on mobile Safari.
2、jquery mobile使用过程中主要遇到个问题,跳转到新页面后js脚本未初始化(jquery mobile内部使用ajax方式请求,脚本放在head中不会被加载),我的解决方法是将js脚本放到<div data-role="page">内。当然还有其他方式,比如在a标签中设置 data-ajax=“false”属性,看自己的需求喽!
3、由于使用jquery mobile只用了一些皮毛,所以遇到的问题并不多,具体的使用细节可以参考官网,推荐一篇文库文章
四、服务器端开发
由于我们服务器端的架构相对复杂,这里不做具体阐述,有兴趣的同学可以看我之前的博客
需要注意的是在eclipse环境下需要安装protocol buffer的插件,很不幸的是在我天朝上国安装这个插件是相对麻烦的 http://protobuf-dt.googlecode.com/git/update-site,因为……
不过苦日子马上就过去了!!!
- js.rar (58.5 KB)
- 下载次数: 26
发表评论
-
Java编程规范
2018-05-21 12:59 1009Java编程规范 一、 命名约束 1. [强制] 代码中的命名 ... -
java面试整理二——JVM
2018-02-25 16:07 8391. JVM的主要结构 JVM ... -
java 面试整理一——基础知识
2018-02-25 16:04 6501. short s1 = 1; s1 = s1 + 1; ... -
Kafka与Spring的集成
2016-01-15 16:10 10743producer public class KafkaSe ... -
linux操作系统下 Jenkins+SVN+Maven+Tomcat 自动集成环境搭建
2016-01-05 15:59 5844一、准备工作 jdk(jdk1.7.0_65.zip) Mav ... -
tcp 连接关闭详解
2014-07-10 14:48 4117主动发起关闭TCP链接端 ... -
Linux下Java线程状态分析
2014-06-11 14:39 5254在Linux上输入top 进入top后按【shift】+【H】 ... -
java面试整理(1)
2012-12-04 15:44 11641. short s1 = 1; s1 = s1 + 1; ... -
Java并发之——同步与原子性
2012-08-27 13:08 1429每一个线程自顾自的做 ... -
基于netty的websocket开发小结
2012-07-27 18:03 60217WebSocket是html5规范新引入的功能,用于解决浏览器 ... -
spring集成log4j配置信息
2012-07-17 14:32 2332spring中集成log4j并非难事,只需要在web.xml ... -
J2EE开发中的java字符编码问题经验总结
2012-07-16 12:28 1567在J2EE程序开发过程中,经常遇到字符的编码问题。这一问题困扰 ... -
使用 Netty 进行 UDP 网络编程
2012-07-16 11:33 32886使用 Netty 进行 UDP 网络编程 在正式开始 ... -
将json字符串转换为对象
2012-07-13 09:52 1455准备将这几年的工作进行一个系统的总结,会陆续发些东西出来供大家 ... -
使用netty+spring搭建游戏框架
2012-07-12 18:52 51544一、 java NIO简介 nio是java New IO的简 ...
相关推荐
Java开发基于SpringBoot+WebSocket+Redis分布式即时通讯群聊系统。一个基于Spring Boot + WebSocket + Redis,可快速开发的分布式即时通讯群聊系统。适用于直播间聊天、游戏内聊天、客服聊天等临时性群聊场景。 ...
基于Spring Boot + WebSocket + Redis,可快速开发的分布式即时通讯群聊系统.zip 1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息...
基于Springboot+Websocket的简单聊天室 基于Springboot+Websocket的简单聊天室 基于Springboot+Websocket的简单聊天室 基于Springboot+Websocket的简单聊天室 基于Springboot+Websocket的简单聊天室 基于Springboot+...
基于Springboot+Vue+WebSocket的校园交友项目基于Springboot+Vue+WebSocket的校园交友项目基于Springboot+Vue+WebSocket的校园交友项目基于Springboot+Vue+WebSocket的校园交友项目基于Springboot+Vue+WebSocket的...
基于Vue+SpringBoot+WebSocket实现Web端聊天系统+网络通信+心跳+客户端服务端+后端java+mysql 项目经过严格测试,确保可以运行! 下载代码后,先配置好yml文件:数据库和微信号appid、secret(other包下面有数据库)...
1、基于netty+websocket+springboot的实时聊天系统项目源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...
毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+...
在本文中,我们将深入探讨如何使用Gin框架、WebSocket技术和MongoDB数据库来构建一个实时的IM(即时消息)聊天系统。这个系统的核心是利用WebSocket提供持久化的双向通信,以实现实时的消息传递。Gin是一个高效的Go...
基于SSM+Websocket的实时在线聊天室项目源码.zip基于SSM+Websocket的实时在线聊天室项目源码.zip基于SSM+Websocket的实时在线聊天室项目源码.zip基于SSM+Websocket的实时在线聊天室项目源码.zip基于SSM+Websocket的...
SpringBoot +Vue3 +Jwt+Editor+WebSocket+Echarts小型超市进销管理系统 SpringBoot +Vue3 +Jwt+Editor+WebSocket+Echarts小型超市进销管理系统 SpringBoot +Vue3 +Jwt+Editor+WebSocket+Echarts小型超市进销管理...
基于HTML5+WebSocket+JAVA的棋牌游戏五子棋程序,IDEA完整工程包src\main\java\com\chanming\common,main\java\com\chanming\websockets
基于Vue+SpringBoot+WebSocket实现Web端聊天系统客户端服务端+后端java+mysql基于Vue+SpringBoot+WebSocket实现Web端聊天系统客户端服务端+后端java+mysql基于Vue+SpringBoot+WebSocket实现Web端聊天系统客户端...
rabbitmq+websocket(SpringBoot版)实现分布式消息推送 本来想用websocket做一个消息推送 可是分布式环境下不支持session共享因为服务器不同 所以采用 rabbitMQ+webSocket实现分布式消息推送 生产者将消息 发送给 ...
本方案"基于vue+websocket+svg的前端实时地图监控"就是针对这一需求提出的一种解决方案。Vue.js作为一个轻量级、高效的JavaScript框架,提供了便捷的组件化开发方式;WebSocket则为实现双向通信提供了可能,确保了...
基于SpringBoot+Websocket+Vue的仿微信即时通讯系统源码+数据库sql(课程大作业).zip基于SpringBoot+Websocket+Vue的仿微信即时通讯系统源码+数据库sql(课程大作业).zip基于SpringBoot+Websocket+Vue的仿微信即时通讯...
基于Springboot+WebSocket开发的web版在线客服聊天系统,一键启动直接使用无需配置,可嵌入到任何B/S架构系统 web版在线客服聊天系统 1.支持自定制广告推送和自动答复,进入监控页面底部按钮自定制消息 2.开箱即用...
springBoot+webSocket+uniapp实现实时聊天功能
【jsmpeg+websocket】是一个基于JavaScript的实时视频流播放解决方案,它结合了jsmpeg库和WebSocket技术,用于在Web浏览器中实现低延迟的RTSP协议视频流播放。这个压缩包文件包含了实现这一功能所需的源码。 **...