服务端

var socketUser = {};
function wsfn (server) {
    var io = require('socket.io')(server);
    io.on('connection', function (socket) {
        socket.on('join', function(data) {
            console.log(`--------${data.user}上线了-----------`);
            socketUser[data.user] = socket;
        });
        // 接口客户端的消息
        socket.on('clientSend', function(data) {
            console.log(`---发送给${data.friend}--message: ${data.message}---`);
            if (socketUser[data.friend]) {
                // 发送给指定客户端
                socketUser[data.friend].emit('clientGet',{
                    message:data.message
                });
            }
        });

        // 客户端断开连接
        socket.on('offOnline', function (data) 
        {
            delete socketUser[data.user];
            console.log(`--------${data.user}断开连接了-----------`);
        });
    });
}

const httpServer = http.createServer(app);
wsfn(httpServer);
httpServer.listen(3001, function () {
    console.log('Server is listening:  http://192.168.9.84:3001');
});

网页端1

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
</head>
<body>
	<button id="btn">发送信息</button>
</body>
<script>
 	var oBtn = document.getElementById('btn');
	var socket = io.connect('http://192.168.9.84:3001');

	socket.emit('join', {user: 'mobileUser'});
	
	oBtn.addEventListener('click', function(){
		socket.emit('clientSend',{
			friend: 'pcUser',
			message: '发送给pc端'
		});
	}, false);

	/*在浏览器刷新或者关闭的时候,让用户断线*/
	window.onbeforeunload=function()
	{
		socket.emit('offOnline',{user: 'mobileUser'});
	}

</script>
</html>

网页端2:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
</head>
<body>
	
</body>
<script>
	var socket = io.connect('http://192.168.9.84:3001');
	var userCode = 'sdfsdf333';
	socket.emit('join', {user: 'pcUser'});
	
	socket.on('clientGet', function(data) {
        console.log('接收到移动端的信号');
        console.log(data);
    });
	
	/*在浏览器刷新或者关闭的时候,让用户断线*/
	window.onbeforeunload=function()
	{
		socket.emit('offOnline', {user: 'pcUser'});
	}
</script>
</html>

如果客户端网页是通过域名进行nginx代理访问的,需要配置nginx将socket.io的服务器端口暴露出去:

server {
    listen       80;
    server_name baidu.com;

    location /socket.io/ {        
        # 此处改为 socket.io 后端的 ip 和端口即可(即是本服务器)
        proxy_pass http://127.0.0.1:3001;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }
}

客户端访问:
var socket = io.connect('http://baidu.com/');