soket-io的常用接口

webdoket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

此文介绍一些 soket.io 的基本使用。
主页:https://socket.io/

1. node + express + soket.io系统搭建

服务器端:
安装:npm install --save socket.io

将soket服务绑到 server 上;

// www文件
var io = require('../routes/websoket.js');
io.attach(server);

//独立的websoket文件
var io = require('socket.io')();
var request = require('request');
io.on('connection', function(socket) {
    console.log('a user connected');
    socket.emit('msg', { msg: '我是智能闲聊高手,放马过来吧!' });
    socket.on('msg', function(obj) {
        // 接入图灵机器人,此处用图灵机器人实现了一个对话功能。
        request({
            url: 'http://www.tuling123.com/openapi/api',
            method: "POST",
            json: true,
            form: {
                'key': '1a6e7a453c1645ee8739f592ef05465e',
                'info': obj.msg,
                'userid': 'naliomg'
            }
        }, function(err, resp, body) {
            if (err) {
                console.log(err);
                return;
            }
            if (body.code == 100000) {
                socket.emit('msg', {msg: body.text});
            }else if(body.code == 200000) {
                socket.emit('msg', {msg: body.text+',<a href="'+body.url+'">点这里</a>'});
            }
        });
    });
});
module.exports = io;

客户端:
客户端需要引入soket.io的js文件,
cdn: https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=1.0" />
    <title>websoket</title>
    <style type="text/css">
        body{
            margin: 0;
            padding: 0;
        }
        .clearfix{
            zoom: 1;
        }
        .clearfix:after{
            content: '';
            display:block;
            width: 0;
            height: 0;
            font-size: 0;
            visibility: hidden;
            clear: both;
        }
        .pull-l{
            float: left;
        }
        .pull-r{
            float: right;
        }
        .container{
            padding: 10px;
            margin: 0 auto;
            box-sizing: border-box;
        }
        .msg-wrap{
            width: 300px;
            height: 400px;
            margin: 10px auto;
            border: 3px solid #ddd;
            overflow: auto;
        }
        .controll-btn{
            width: 300px
        }
        #sendMsg{
            width: 220px;
            height: 40px;
            color: #aaa;
            box-sizing: border-box;
        }
        #send{
            height: 40px;
        }
    </style>
    <script type="text/javascript" src="/utils/jquery/jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
</head>
<body>
    <div class="msg-wrap container" id="log"></div>
    <div class="controll-btn container clearfix">
        <input id="sendMsg" class="pull-l" type="text" placeholder="请输入内容"></input>
        <input id="send" class="pull-r" type="button" value="发送"></input>
    </div>
    <script>
        $(function(){
            var socket = io('http://naliomg.site');
            socket.on('msg', function(resp){
                $('#log').append('<p class="clearfix"><span class="pull-l">'+resp.msg+'</span></p>');
                $('#log').scrollTop( $('#log')[0].scrollHeight );
            });
            $('#send').on('click', function(){
                var msg = $('#sendMsg').val();
                if (msg.trim()=='') {
                    alert('消息不能为空~');
                    return;
                }
                socket.emit('msg', {msg: msg});
                $('#log').append('<p class="clearfix"><span class="pull-r">'+msg+'</span></p>');
                $('#sendMsg').val('');
                $('#log').scrollTop( $('#log')[0].scrollHeight );
            });
            $('#otherConnect').on('click', function(){
                var nameSoket = io('/test');
            });
        })
    </script>
</body>
</html>

2. 服务器端常用API

//监听客户端连接,回调函数会传递本次连接的socket
io.on('connection',function(socket){ 
    //监听客户端发送的信息
    socket.on('event',function(data){});
    //给该socket的客户端发送消息
    socket.emit('event', data);
    //给除了自己以外的客户端广播消息
    socket.broadcast.emit("msg",{data:"hello,everyone"}); 
    //分组
    socket.on('group1', function (data) {
        socket.join('group1');
    });
    socket.on('group2',function(data){
        socket.join('group2');
    });
    //一个客户端可以存在多个分组(订阅模式)
    socket.emit('group1'); //就可以加入group1分组;
    socket.emit('group2'); //就可以加入group2分组;
    socket.leave(data.room); //退出分组
    //对分组中的用户发送信息,不包括自己
    socket.broadcast.to('group1').emit('event_name', data); 
});    
//给所有客户端广播消息
io.sockets.emit('event',data); 
//给指定的客户端发送消息
io.sockets.socket(socketid).emit('event', data);
//对分组中的用户发送信息,不包括自己
io.sockets.in('group1').emit('event_name', data);
//获取连接的客户端socket
io.sockets.clients().forEach(function (socket) {
    //.....
});
//获取分组信息
//获取所有房间(分组)信息
io.sockets.manager.rooms;
//来获取此socketid进入的房间信息
io.sockets.manager.roomClients[socket.id];
//获取particular room中的客户端,返回所有在此房间的socket实例
io.sockets.clients('particular room');
//另一种分组方式
io.of('/some').on('connection', function (socket) {
    socket.on('test', function (data) {
        socket.broadcast.emit('event_name',{});
    });
});

3. 客户端常用API

//建立一个socket连接
var socket = io("ws://103.31.201.154:5555");
//监听服务消息
socket.on('msg',function(data){
    socket.emit('msg', {rp:"fine,thank you"}); //向服务器发送消息
    console.log(data);
});
//监听socket断开与重连。
socket.on('disconnect', function() {
    console.log("与服务其断开");
});
socket.on('reconnect', function() {
    console.log("重新连接到服务器");
});

客户端socket.on()监听的事件:
connect:连接成功
connecting:正在连接
disconnect:断开连接
connect_failed:连接失败
error:错误发生,并且无法被其他事件类型所处理
message:同服务器端message事件
anything:同服务器端anything事件
reconnect_failed:重连失败
reconnect:成功重连
reconnecting:正在重连

当第一次连接时,事件触发顺序为:connecting->connect;当失去连接时,事件触发顺序 为:disconnect->reconnecting(可能进行多 次)->connecting->reconnect->connect。

THE END!