new function() {
var ws = null;
var connected = false; var serverUrl;
var connectionStatus;
var sendMessage; var connectButton;
var disconnectButton;
var sendButton; var open = function() {
var url = serverUrl.val();
ws = new WebSocket(url);
ws.onopen = onOpen;
ws.onclose = onClose;
ws.onmessage = onMessage;
ws.onerror = onError; localStorage.setItem("server", url); connectionStatus.text('OPENING ...');
serverUrl.attr('disabled', 'disabled');
connectButton.hide();
disconnectButton.show();
}; var close = function() {
if (ws) {
console.log('CLOSING ...');
ws.close();
}
connected = false;
connectionStatus.text('CLOSED'); serverUrl.removeAttr('disabled');
connectButton.show();
disconnectButton.hide();
sendMessage.attr('disabled', 'disabled');
sendButton.attr('disabled', 'disabled'); loginName.attr('disabled', 'disabled');
loginPass.attr('disabled', 'disabled');
loginButton.attr('disabled', 'disabled');
}; var clearLog = function() {
$('#messages').html('');
}; var login = function(event) {
var name = loginName.val();
var password = loginPass.val();
if(name!= "" && password != ""){
var msg= "login|"+ name + "|"+ password;
ws.send(msg); localStorage.setItem("name", name);
localStorage.setItem("password", password);
}else{
alert("name and password cant't be empty!")
}
}; var doLogin= function(msg){
if(msg.substr(0, 5)== "login"){
sendMessage.removeAttr('disabled');
sendButton.removeAttr('disabled'); loginName.attr('disabled', 'disabled');
loginPass.attr('disabled', 'disabled');
loginButton.attr('disabled', 'disabled'); return "login success!"
}else if(msg.substr(0, 3)== "msg"){
return msg.substr(4)
}else{
}
return ""
}; var onOpen = function() {
console.log('OPENED: ' + serverUrl.val());
connected = true;
connectionStatus.text('OPENED'); //sendMessage.removeAttr('disabled');
//sendButton.removeAttr('disabled'); loginName.removeAttr('disabled');
loginPass.removeAttr('disabled');
loginButton.removeAttr('disabled');
}; var onClose = function() {
console.log('CLOSED: ' + serverUrl.val());
ws = null;
}; var onMessage = function(event) {
var data = event.data;
//login
data= doLogin(data)
//todo
if(data){
addMessage(data);
//$('#messages').val("");
//getLog();
db.transaction(function (tx) {
tx.executeSql('INSERT INTO LOGS (content) VALUES ("'+ data+ '")');
});
}
}; var onError = function(event) {
alert("error, maybe socket closed!")
//alert(event.data);
}; var addMessage = function(data, type) {
var msg = $('<pre>').text(data);
if (type === 'SENT') {
msg.addClass('sent');
}
var messages = $('#messages');
messages.append(msg);
messages.append($("<br>")); var msgBox = messages.get(0);
while (msgBox.childNodes.length > 10000) {
msgBox.removeChild(msgBox.firstChild);
}
msgBox.scrollTop = msgBox.scrollHeight;
}; var getLog= function(start, limit){
if(typeof(start) == undefined || !start){
start= 0
}
if(typeof(limit) == undefined || !limit){
limit= 10000
}
//log
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM LOGS limit ?, ?', [start, limit], function (tx, results) {
var len = results.rows.length, i;
for (i = 0; i < len; i++){
msg = results.rows.item(i).content;
//document.querySelector('#status').innerHTML += msg;
//alert(msg)
addMessage(msg);
}
}, null);
});
};
WebSocketClient = {
init: function() {
serverUrl = $('#serverUrl');
connectionStatus = $('#connectionStatus');
sendMessage = $('#sendMessage'); connectButton = $('#connectButton');
disconnectButton = $('#disconnectButton');
sendButton = $('#sendButton'); loginName= $('#name');
loginPass= $('#password');
loginButton= $('#loginButton'); if(cache_server!= null)serverUrl.val(cache_server)
if(cache_name!= null)loginName.val(cache_name)
if(cache_password!= null)loginPass.val(cache_password) getLog(); loginButton.click(function(e) {
login();
}); connectButton.click(function(e) {
close();
open();
}); disconnectButton.click(function(e) {
close();
}); sendButton.click(function(e) {
var msg = $('#sendMessage').val();
if(msg== "" ){
alert("You must say something!")
}else{
ws.send("msg|"+ msg);
$('#sendMessage').val("")
}
}); $('#clearMessage').click(function(e) {
clearLog();
}); var isCtrl;
sendMessage.keyup(function (e) {
if(e.which == 17) isCtrl=false;
}).keydown(function (e) {
if(e.which == 17) isCtrl=true;
if(e.which == 13 && isCtrl == true) {
sendButton.click();
return false;
}
});
}
};
} $(function(){
cache_server= localStorage.getItem("server")
cache_name= localStorage.getItem("name")
cache_password= localStorage.getItem("password") db = openDatabase('mydb', '1.0', 'Test DB', 5 * 1024 * 1024); db.transaction(function (tx){
tx.executeSql("CREATE TABLE IF NOT EXISTS LOGS ('id' integer primary key autoincrement,'content' text)");
}); WebSocketClient.init(); });

基于html5 localStorage , web SQL, websocket的简单聊天程序的更多相关文章

  1. websocket实现简单聊天程序

    程序的流程图: 主要代码: 服务端 app.js 先加载所需要的通信模块: var express = require('express'); var app = express(); var htt ...

  2. 基于HTML5移动web应用

    一.基于HTML5移动web应用 1.canvas 绘图 2.多媒体 3.本地存储 4.离线应用 5.使用地理位置 6.移动web框架   二.具体说明 1.HTML5标准最大的变化就是支持Web绘图 ...

  3. Monotype推出基于HTML5的Web字体平台

    著名字体公司Monotype近日宣布推出基于HTML5的Web字体平台,设计者可以访问近10万字体的目录. Monotype推出基于HTML5的Web字体平台 Monotype推出基于HTML5的We ...

  4. localStorage存值取值以及存取JSON,以及基于html5 localStorage的购物车

    localStorage.setItem("key","value");//存储变量名为key,值为value的变量 localStorage.key = &q ...

  5. 基于HTML5的Web SCADA工控移动应用

    在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...

  6. 基于HTML5的Web跨设备超声波通信方案

    前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾 ...

  7. 阿伦学习html5 之Web SQL Database

    不知道什么情况, W3C不再维护web SQL Database规范,但是大多浏览器都支持了! Web SQL Database规范页面有着这样的声明 Web SQL Database 规范中定义的三 ...

  8. HTML5的Web SQL Database

    本文将介绍 Web SQL Database 规范中定义的三个核心方法: openDatabase:这个方法使用现有数据库或新建数据库来创建数据库对象 transaction:这个方法允许我们根据情况 ...

  9. Android 网络编程基础之简单聊天程序

    前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...

随机推荐

  1. 大一C语言结课设计之《简单计算器》

    /*===============================================*\ ** 设计目的:简单计算器,计算形如10*(20.2-30.6)+5.0/2的表达式值 ** 简 ...

  2. http动态调用webserive

    前言 传统方式调用WebService是直接引用服务,生成客户端代理类类,这种方式将ws进行了再次封装,并以代理的方式进行调用,这种方式的优点是简单,方便. 但是此种方式不足的地方是,当对方ws接口变 ...

  3. [译]在 64bit 环境中执行32 bit的SSIS包

    最近碰到了一个众所周知的32bit的 SSIS 包在64bit的SQL Server环境的执行问题. 我看了一些解决方案,比如修改在SSDT里面修改 debug 选项(Run64BitRuntime ...

  4. 关于Comparable接口的使用

    一.使用Comparable接口进行排序:如何要都某种数据类型或者是自定义的类进行排序必须要实现Comparable jdk定义的基本数据类型和String类型的数据都实现了Comparable.下面 ...

  5. centos5.5 安装git

    查看centos版本 # cat /etc/redhat-release CentOS release 5.5 (Final) 安装git 下载: 如果有老版本的git: #git clone git ...

  6. qnx:从API开始理解QNX -- 消息传递

    从API开始理解QNX -- 消息传递    http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161 1. 频道与连接    Chann ...

  7. Android目录结构介绍&Android学习之hello world

    分类: 嵌入式 一个android项目有如下目录: src:这里放的是我们编写的源代码 gen:这里的是eclipse自动生成的文件,不用管它 asssts:放置文件 res:也是放置文件,不同的是r ...

  8. apt-get 命令详解(中文),以及实例

    apt-get 命令详解(中文),以及实例 一,什么的是apt-get 高级包装工具(英语:Advanced Packaging Tools,简称:APT)是Debian及其衍生发行版(如:ubunt ...

  9. Android Bug 记录

    1.Unable to resolve target 'android-5' 无法解析目标 ' 安卓系统-5'      Unable to resolve target 'Google Inc.:G ...

  10. NSData 数据转换

    NSData,数据,当我们需要把一些信息写入到文件里或发送到网络上,我们需要把这些数据转换下,变成纯粹的0.1字符流 数组转 NSData NSData *GLYtime = [NSKeyedArch ...