socket.io

socket.io

官网

主要是解决轮询带来的资源浪费,通过长连接,主要以事件注册(socket.on)和事件触发(socket.emit)通信

官网上有简单的demo:

//server.js
var app = require('express')();
var http = require('http').createServer(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
 res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){  //建立连接时触发
 console.log('a user connected');
 socket.on('disconnect', function(){  //断开连接时触发
   console.log('user disconnected');
 });
 socket.on('chat message', function(msg){  //定义server事件,由client触发
   io.emit('chat message', msg);  //触发cliet事件
 });
});

http.listen(3000, function(){
 console.log('listening on *:3000');
});

//client.js
<script>
 $(function () {
   var socket = io();
   $('form').submit(function(e){
     e.preventDefault(); // prevents page reloading
     socket.emit('chat message', $('#m').val());  //触发server事件
     $('#m').val('');
     return false;
   });
   socket.on('chat message', function(msg){  //定义client事件
     $('#messages').append($('<li>').text(msg));
   });
 });
</script>

以上demo是消息的发送,下面介绍两种图片的发送

1、使用FileReader把图片文件转成base64,当作信息发送到server,再由server分发到其他client
//client.js
$('#pic').change((e) => {
	const file = e.target.files[0]
	const reader = new FileReader()
	reader.readAsDataURL(file)
	reader.onload = function() {
	    socket.emit('sendTu', { img: this.result })  //this.result  :base64发送到server
	}
}
//server.js
socket.on('sendTu', msg => {  //接收base64
    msg.id = socket.id
    socket.emit('renderTu', msg)  //分发给自己
    socket.broadcast.emit('renderTu', msg)  //分发到其他client
})
2、使用ajax发送文件到server,再由server分发图片地址,使用到FormData
//client.js
const post = (url, data, cb) => {
    const req =new XMLHttpRequest()
    req.open('POST', url, true)
    req.send(data)
    req.onreadystatechange = () => {
        if(req.readyState == 4) {
            if((req.status  >= 200 && req.status  < 300) || req.status  == 304) {
                console.log('succeess', req.responseText)
                typeof cb === 'function' && cb(req.responseText)
            }
        }
    }
}
$('#pic').change((e) => {
    const file = e.target.files[0]
    const formData = new FormData()
    formData.append(file.name, file)
    post('/sendPic', formData, res => {
        const data = JSON.parse(res)
        socket.emit('sendTu', { img: data.path })  //接收到路径,通知server进行分发地址
    })
}
//server.js  //需要用到formidable模块,npm安装即可
app.use(express.static(__dirname + '/static'))  //设置static为静态文件目录
app.post('/sendPic', (req, res) => {
   console.log('sendPic')
   let imgname = null;
   let form = new formidable.IncomingForm();
   form.uploadDir = './static/images';  //保存到static/images目录下
   form.parse(req, (err, fields, files) => {
       res.send(imgname);  //存储成功把路径返回
   });
   form.on('fileBegin', (name, file) => {
       file.path = path.join(__dirname, `./static/images/${file.name}`);
       imgname = { name: file.name, path: `/images/${file.name}` };  
   })
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值