在一个聊天室系统中,经常使用websocket做为通讯的主要方式。
参考地址:https://www.jianshu.com/p/00e...node
关于本身的见解:
websocket协议是一种新的tcp协议,与经常使用的http协议不一样的地方在于,不管是客户端仍是服务端,都能进行自由通讯,双方都比较灵活,不会有局限性。
文中所提到的socket.io包是封装有websocket协议的包,他包含很多服务端处理的代码,兼容性强,主要服务于实时通讯。
开始以前,须要构建网络服务,主要用到的包就是socket.io和http服务的包,因为是node的后台,因此须要设置一个进行监听的端口,方便在浏览器中调试。web
/*app.js*/ /*构建http服务*/ var app = require('http').createServer() /*引入socket.io*/ var io = require('socket.io')(app); /*定义监听端口,能够自定义,端口不要被占用*/ var PORT = 8081; /*监听端口*/ app.listen(PORT);
后台系统为nodejs搭载浏览器
主要应用在聊天系统中socket.io中的方法:websocket
对于第一种,socket.emit()方法主要是在客户端和服务端之间进行信息请求,例如客户端向服务端发送请求或者服务端向客户端进行反馈请求,这两种状况下主要用到的方法。
需求场景:客户端上,用户输入帐号密码进行登录,服务端怎么识别?
(1)首先是客户端获取到用户在输入框中的信息,而后对服务端进行发送信息。网络
socket.emit('login',{username:uname})
代码块中,login为自定义方法名,其后是传送的数据,项目中只考虑到用户名的输入,因此保存为一个对象发送给服务端,这里用到了socket.emit()方法,是客户端----->服务端的请求。
(2)服务端对客户端所发送的请求进行处理app
socket.on('login',function(data){ /*登录验证等操做*/ })
在这里,经过socket.on来接受客户端所传递的数据,为相同方法名,其后跟的function函数为登录验证的具体操做,好比用户验证是否存在。
(3)服务端验证成功了,把反馈信息发送给客户端。
经过上面知道,一端向另外一端发送请求的时候,须要用到socket.emit()方法,可是此次是服务端向客户端进行发送消息。socket
socket.emit('loginSuccess',data)
这里,把以前客户端所发送的请求,再次返回去,让客户端进行操做。
(4)客户端接收返回结果
接收的方法,仍是socket.on(),不过此次是客户端接收服务端所传递回来的信息。tcp
socket.on('loginSuccess',function(data){ if(data.username === uname){ checkin(data) }else{ alert('用户名不匹配,请重试') } }) function checkin(data){ /*隐藏登录界面,显示聊天主页*/ $('.login-wrap').hide('slow'); $('.chat-wrap').show('slow'); }
经过以上4步,一次成功的登录请求就成功了。ide
关于全频道广播功能
项目中提到了全频道的广播的功能,而io.sockets.emit的定义是服务端进行全频道广播,也就是对全部客户端进行广播,也跟咱们经常在聊天中收到的官方推送同样。函数
io.sockets.emit('leave',username)
当用户进入或者离开时,会进行全频道广播,也就是经过io.sockets.emit方法进行。
最后感谢@一岑再也不博主所写的demo项目,让我受益不浅。
一岑博主主要文章传送门:连接描述