基于html5 localStorage , web SQL, websocket的简单聊天程序

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的简单聊天程序,布布扣,bubuko.com

时间: 2024-10-22 22:35:14

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

websocket实现简单聊天程序

程序的流程图: 主要代码: 服务端 app.js 先加载所需要的通信模块: var express = require('express'); var app = express(); var http = require('http').createServer(app); var io = require('socket.io').listen(http); var fs = require('fs'); 创建用户列表和消息列表: var person = []; var history =

Smarge——基于HTML5 localStorage的key-value缓存框架

缓存是任何一个Web程序都需要重视的内容.受到Redis的启发,我想到开发一个基于HTML5 localStorage的key-value缓存框架,做了一些尝试之后,便有了Smarge这样一个产物. 大家都知道,HTML5的localStorage没有超时的机制,也不能存储数组和对象等类型,更没有命令空间等思想. 这些问题,在Smarge中都得到了解决. 项目地址:https://git.oschina.net/jiusem/Smarge.git 说明:Smarge1.0.js是完整的源代码,以

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

http://blog.csdn.net/u013267266/article/details/51530611 localStorage.setItem("key","value");//存储变量名为key,值为value的变量 localStorage.key = "value"//存储变量名为key,值为value的变量 localStorage.getItem("key");//获取存储的变量key的值www.it16

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

著名字体公司Monotype近日宣布推出基于HTML5的Web字体平台,设计者可以访问近10万字体的目录. Monotype正在打造一个集全功能于一身的Html5字体平台,目的是为用户提供一站式解决方案.品牌可以授权新的字体,或者使用来自合法来源的第三方字体包,Monotype在此平台上向用户默认提供14个免费字体系列.目前的Web字体平台针对的是品牌和企业,该公司希望能尽快把它提供大众消费者. 目前网页设计师已将目光转向HTML5,但是如何获得获得高质量的字体仍然让他们头疼.虽然目前已经有一些

利用命名管道实现进程间的通信(简单聊天程序的实现)

管道的本质是一种文件,通常是指把一个进程的输出直接传递给另一个进程的输入. 命名管道(named pipe)是一种特殊的文件类型(FIFO文件),它在文件系统中以文件名的形式存在. 下面是Linux中命名管道的文件格式: 通过命令行创建命名管道可以通过mkfifo命令,函数调用如下所示: 1 #include <sys/types.h> 2 #include <sys/stat.h> 3 4 int mkfifo(const char *filename,mode_t mode);

Linux下C语言多线程,网络通信简单聊天程序

原文:Linux下C语言多线程,网络通信简单聊天程序 功能描述:程序应用多线程技术,可是实现1对N进行网络通信聊天.但至今没想出合适的退出机制,除了用Ctr+C.出于演示目的,这里采用UNIX域协议(文件系统套接字),程序分为客户端和服务端.应用select函数来实现异步的读写操作. 先说一下服务端:首先先创建套接字,然后绑定,接下进入一个无限循环,用accept函数,接受“连接”请求,然后调用创建线程函数,创造新的线程,进入下一个循环.这样每当有一个新的“连接”被接受都会创建一个新的线程,实现

《Java项目实践》:简单聊天程序

<Java项目实践>:简单聊天程序 由于这个简单程序,还是涉及到很多的知识点,下面我们就一点一点的来完成. 我们熟悉的QQ聊天,就有一个界面,是吧,我们自己做一个简单的聊天程序,因此我们也就需要为Client写一个界面.因此,这就是我们第一步需要完成的任务. 第一步:为Client端写一个界面 完成一个界面有两种方法,一种是使用Frame对象来完成,另外一种是继承JFrame类来完成.本项目使用第二种. 第二种继承JFrame类完成的界面的程序如下: public class ChatClie

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

在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在HTML5流行前VML和SVG算是真正纯种Web方案也是有不少应用,近些年随着HTML5的流行,加上移动终端对HTML5支持的普及,越来越多新项目开始采用真正纯HTML5的方案,更具体的说大数据量应用性能高于SVG的Canvas方案,已经逐渐成为当今Web SCADA前端技术的首选标配方案. htt

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

前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾经试推过“声波支付”,利用手机发送超声波至终端作为交易密码进一步完成交易.然而支付宝的技术目前只是使用在了支付上,而需要可接受声波支付的特定售货机方可使用. <Advanced Sound for Games and Interactive Apps - WebAudio API>的作者Boris