socket.io -- 通信
来源:互联网 发布:sweet alert.js 编辑:程序博客网 时间:2024/06/03 23:00
WebSocket
WebSocket 是一种网络通信协议,很多高级功能都需要它。HTTP协议有一个缺陷,通信只能由客户端发起。而Websocket协议在2011年成为国际标准。所有浏览器支持了。它最大的特点是:
服务器可以主动向客户端推送消息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
目前所有的主流Web语言都有对WebSocket做很好的支持,其中也有很多优秀的通讯框架可以任你挑选,因此万万不可畏惧它的存在,除非你真的想用Ajax轮询去解决消息I/O。WebSocket会使得你的消息接受和传递变得极其轻松,最重要的一点是,性能卓绝。WebSocket的建立非常简单
官网: https://socket.io/
Server API (服务端):https://socket.io/docs/server-api/
Client API (客户端):https://socket.io/docs/client-api/
服务端
Server 类
通过http.createServer创建服务,再通过io = require('socket.io')(server)返回Server类(即:io就是Server类)。
1. 创建Server类(socket.io的初始化实例)
1). Node http server
Server(app.js)
// 引入node.js的内置http模块var http = require('http') // 创建http.server实例,返回Server类。 //handler是带有两个参数(req, res)的函数,会自动添加到request事件var server = http.createServer(handler);//引入socket.io模块,并进行socket.io的实例初始化var io = require('socket.io')(server); //引入Node.js的fs文件系统模块var fs = require('fs'); //监听 HTTP 服务器的连接function server.listen(80); //创建http.server实例的回调函数 handler (req, res) { // __dirname : Node.js的全局常量,是运行当前文件的目录路径;读取指定目录下的文件 fs.readFile(__dirname + '/index.html', function (err, data) { //回调函数 if (err) { res.writeHead(500); return res.end('Error loading index.html'); //如果指定data,则相当于调用response.write(data) } // 发送一个响应头(响应头包括:状态码、可选的状态描述、可选的响应头对象)给请求。 res.writeHead(200); res.end(data); // res.end()通知服务器,所有响应头和响应主体都已经被发送。 });}//对客户端发起连接 io.on('connection', function (socket) { //socket === 返回的Socket类});
2). Express 3/4
Server(app.js | bin/www)
var app = require('express')();var server = require('http').Server(app);var io = require('socket.io')(server);server.listen(80);io.on('connection', function (socket) { //返回的Socket类});
3). Express 2.x
Server(app.js)
var app = require('express').createServer();var io = require('socket.io')(app);app.listen(80);io.on('connection', function (socket) { //返回Socket类});
2. Server类的常用属性方法
1). io.sockets
io.sockets返回Namespace类;Namespace类表示为在指定的pathname(即在socket.io创建实例时的path,默认是'/')的范围内,所连接的所有socket类对象。
属性作用:可通过socket类对应的id找到相应的socket类,然后给指定的socket类的客户端发送event;
2). io.of(nsp)
· nsp: String 路径标识符
· 返回 Namespace
作用:
Socket (类) -- 连接成功返回socket类作为回调函数的参数
简介:
Socket类是服务端与浏览器客户端的基本的交互类。属于一个命名空间,使用底层客户机进行通信的。
需要注意的是:Socket并没有直接与实际的底层TCP/IP socket相关,它仅仅是一个类的名。
在每个命名空间中,还可以定义任意通道(所谓的 room),这些通道中,Socket类可以连接和断开,提供简便的方法进行broadcast(传播)到一个组。
Socket类继承 Node.js的EventEmitter的方法,Socket类重写emit方法而不修改其他任何方法。
注意:每次刷新、打开新页面生成的Socket类都是不一样的。
1. socket.emit(eventName[, args][, callback])
eventName: String 事件名
返回: Socket 类
作用:将事件发送到有eventName字符串标识的socket,连同任何参数、所有可序列化的数据结构、包括缓冲区一并发送。
callback:回调函数的参数可选,该参数用于接收 客户端的事件监听( client.socket.on() )的数据
server端:
io.on('connection', (socket) => { socket.emit('test', 'tobi', (data) => { console.log(data); // data will be 'emit 的回调函数的测试' });});client端:
socket.on('test', (name, fn) => { fn('emit 的回调函数的测试');});
2. socket.broadcast.fn()
作用:给设置了标识符的事件方法发送数据,所以在线的都能接受数据,除了发送者自己。
Demo:
server端:
socket.on('add user', function (username) { // 将username记录到session socket.username = username; // 统计在线的人数 ++numUsers; // 所有在线的可以接收该事件,除了该发送者 socket.broadcast.emit('user joined', { username: socket.username, numUsers: numUsers }); });client端:
$('#loginBtn').on('click', function(){ //给服务端发送登录的信息 var username = $('.inputName').val(); socket.emit('add user', username);}); //接收服务端发送的event和数据 //客户端监听的eventName要与服务端 emit的eventName对应 //才可接收成功socket.on('user joined', function (data) { var $el = $('<div>').text(data.username + ' joined'); //创建节点显示数据,告诉在线的所有伙伴 -- 有新成员加入 //新成员接收不到该message $('.log').append($el);});
3.socket.on(eventName , callback)
eventName:String 接收客户端发送的event标识符
callback:回调函数,接收一个参数,用于接收来自客户端的数据
作用:用于接收Client端的event以及数据,并监听该事件
客户端
客户端需要安装 socket.io-client
客户端需要安装的socket.io库 : https://github.com/socketio/socket.io-client
socket.io-client的核心目录:https://github.com/socketio/socket.io-client/tree/master/dist
IO类
1. 引入io的类
1). 普通的javascript
<script src="/socket.io/socket.io.js"></script><script> const socket = io('http://localhost');</script>
2). 模块化引入
const io = require('socket.io-client');// or with import syntaximport io from 'socket.io-client';
Socket类
1. socket.on(eventName, callback);
作用:给客户端注册一个事件处理,接收服务端对应 eventName的event以及数据
参数:
eventName:String 与服务端对应的event 标识符
callback:回调函数
返回值: Socket类
Demo:
socket.on('news', (data) => { //data是服务端发送的data console.log(data);});
2. socket.emit(eventName [, args] [, callback])
作用:给服务端对应的event标识符发送event和数据,告诉服务端进行监听事件
参数:
eventName: String event标识符
args:多个参数
callback:回调函数
返回值:Socket类
Demo:
Client(客户端)
var username = 'Lucy';socket.emit('login', username, (data) => { console.log(data); // data = I'm a happy Boy!And my name is Lucy});Server(服务端)
io.on('connection', (socket) => { socket.on('login', (name, fn) => { var mgs = "I'm a happy Boy!And my name is "+name; fn(msg); }) })
总结:
1. 无论是客户端还是服务端,主要的通信是依赖 socket.emit和socket.on这两个方法展开。
2. socket.emit是发送event和数据,socket.on是监听event并接收数据。
3. socket.emit和socket.on之间的通信是通过eventName的event标识符进行识别对应。
4. 服务端与客户端使用的socket.io不是同一套,服务端使用socket.io,客户端使用socket.io-client
5. 连接socket:(1) 服务端: var io = require('socket.io')(HttpServer) (2) 客户端:var socket = io();
- 通信模型socket.io
- socket.io -- 通信
- Nodejs 即时通信socket.io
- Java IO之Socket通信
- Java NIO(异步IO)Socket通信例子
- socket.io一对一通信的实现
- IO完成端口用于socket通信
- nodejs+socket.io实现websocket通信初探
- 【Node之web通信Socket.IO】
- APUE学习笔记——socket通信 阻塞IO
- express+socket.io完成客户端与服务器的通信
- 使用socket.io和node.js搭建及时通信系统
- java.Socket。io通信,Unrecongnized Windows Sockets error:0:JVM_BIND
- socket.io 实时通信在nodejs下的应用
- socket IO
- SOCKET.IO
- socket io
- IO::Socket
- git常用命令
- 《Java虚拟机原理图解》 1.1、class文件基本组织结构
- 设计模式(二十六)------23种设计模式(18):桥接模式
- 给定一个字符串,你需要颠倒每个单词中的字符顺序,同时仍然保留空白和初始的字顺序。
- 数学笔记30——无穷级数和收敛判定
- socket.io -- 通信
- 用SVM预测股票涨跌
- JAVA将字符串Sat Nov 25 2017 00:00:00 GMT+0800 (中国标准时间)转成标准时间
- 《Thing in java》多态
- STM32 串口ISP下载方式解读
- Cuda入门代码
- Go基础编程:复合类型—切片slice
- linux下安装部署jenkins
- js实现PC端根据IP定位当前城市地理位置