websocket协议—socket.io设计一个简易聊天室 (二)

介绍了原生websocket的使用,接着学习使用socket.io:

socket.io 是基于 WebSocket 的 C-S 实时通信库,底层是 engine.io,这个库实现了跨平台的双向通信。
engine.io 使用了 WebSocket 和 XMLHttprequest(或JSONP) 封装了一套自己的 Socket 协议(暂时叫 EIO Socket),在低版本浏览器里面使用长轮询替代 WebSocket。一个完整的 EIO Socket 包括多个 XHR 和 WebSocket 连接.

常用api:

socket.emit

数据传输对象为当前socket对应的client,其他各个client socket互相不影响;

socket.broadcast.emit

数据传输对象为所有client,排除当前socket对应的client;

io.sockets.emit

数据传输对象为所有client,包括触发当前事件的client;


使用:

1.安装express,聊天室需要局域网的呀,局域网需要启动http服务呀,所以安装express;


2.安装socket.io,cnpm i --save socket.io   装好后它分为前端、后端两部分,前端页面引入:(在文件中看不到,等连接服务的时候就会出现),会自动生成一个文件夹名字就叫socket.io,以及文件夹内生成socket.io.js文件


3.创建mainjs文件,开始撸:

直接贴出写好的代码了:

mainjs:

var express = require("express");
var app = express();
//因为socket.io依赖原生http服务,所以要引入原生http模块,并且调用它的Server()方法将app传入,这样原生的http就拥有了express的方法
var http = require("http").Server(app);
var socket = require("socket.io")(http);//传入http执行socket函数,这样socket就跟http具有同一个端口了
http.listen(9999);

app.use(express.static("./html"));//设置静态资源路径

// 创建socket监听服务:
socket.on("connection", function(ws){
	ws.on("diyLogin", function(val){//定义一个完全自定义事件,用来获取前端发来的登录的用户名
		var address = ws.handshake.address;
		console.log(address);
		var u =  checkUser(val);
		if(u.err){
            ws.emit("exist", u);
        }else{
        	socket.sockets.emit("allLogin", u);//执行前端事件,发送范围为每一个在线的客户端
        }
	});

	ws.on("sendMsg", function(msgObj){
		socket.sockets.emit("accept", msgObj);//把接收到的某个用户消息发送到所有客户端
	})
	
})

var arr = [];
function checkUser(u){//检测用户名是否已存在
	if(arr.length === 0){
		arr.push(u);
		return u;
	};
	for(var i = 0; i < arr.length; i++){
		if(arr[i] === u){
			return {
				err: "用户名已存在",
				users: arr
			}
		}
	}
	arr.push(u);
	return u;
}

html:




	
	Document
    
	


	
个人理解:

socket.io实现了一对多的B-S双向通信,是基于事件驱动的,相当于后台自定义一个事件,前端触发,前端自定义一个事件,后台触发,同时可以选择socket.io提供的方法指定数据发送的范围,比如发给哪一个客户端;





你可能感兴趣的:(nodeJS)