服务端
var app = require('express')();
var fs = require('fs');
var db = require('./mysql.js');
var express = require('express');
/**引入证书*/
var options = {
key: fs.readFileSync('./2_www.fxg1997.top.key'),
cert: fs.readFileSync('./1_www.fxg1997.top_bundle.crt')
};
/**配置https*/
var https = require('https').Server(options, app);
/**引入socket.io*/
var io = require('socket.io')(https);
https.listen(9528, function () {
console.log('listening on *:9528');
});
app.use('/web', express.static('web'));
/**设置跨域访问,允许所有跨域*/
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
/*判断电脑还是手机*/
app.get('/', function (req, res) {
var deviceAgent = req.headers["user-agent"].toLowerCase();
var agentID = deviceAgent.match(/(iphone|ipod|ipad|android)/);
if (agentID) {
res.end('请用电脑打开');
} else {
res.redirect('./web/test/index.html')
res.end();
}
res.redirect('./web/test/index.html')
res.end();
});
/**重定向网页*/
app.get('/dist', function (req, res) {
res.redirect('./web/dist/index.html')
res.end();
})
app.get('/test', function (req, res) {
res.redirect('./web/test/index.html')
res.end();
})
/*读取单个html*/
app.get('/websocket', function (req, res) {
fs.readFile('./websoket.html', 'utf-8', function (err, data) {
if (err) {
throw err;
}
res.end(data);
});
})
/**
*system所有支线客户端接受消息
*public为公共消息,户端会显示,最高级别信息
*Init初始化连接
*logined为登录后的系统消息,客户端会显示,并且会加载用户列表和对应的记录
*privatechat私聊消息
**/
/**
* 发送给当前客户端
socket.emit('hello', 'can you hear me?', 1, 2, 'abc');
发送给所有客户端,除了发送者
socket.broadcast.emit('broadcast', 'hello friends!');
**/
var users = {};
io.on('connection', function (socket) {
socket.emit("Init", '建立连接');
/*用户上线*/
socket.on('login', function (user) {
let obj = JSON.parse(user)
users[obj.Id] = socket.id;
socket.emit("logined");
console.log('新用户上线:', users)
})
/*私聊信息交互*/
socket.on('msg', function (data) {
var obj = JSON.parse(data)
console.log(data)
if (users[obj.toId] == undefined) {
socket.emit('public', '用户还未上线'); // 将消息发给当前用户
} else {
var addSql =
'INSERT INTO chatlist(Id,content,type,formId,toId,createTime) VALUES (0,?,?,?,?,NOW())'
let modSqlParams = [obj.content, obj.type, obj.Id, obj.toId];
console.log(modSqlParams)
db.query(addSql, modSqlParams, function (err, result) {
if (err) {
console.log('[INSERT ERROR] - ', err.message);
return;
}
let req = {
type: obj.type,
createTime: new Date(),
content: obj.content,
toId: obj.toId,
formId: obj.Id,
}
io.to(users[obj.toId]).emit('privatechat', JSON.stringify(req));
socket.emit('privatechat', JSON.stringify(req));
});
}
});
/*监听用户退出*/
socket.on('loginOut', function (data) {
var obj = JSON.parse(data)
delete users[obj.Id]
});
/*监听客户端断线,仅仅指空间名*/
socket.on('disconnect', function () {
for (let key in users) {
if (users[key] == socket.id) {
delete users[key]
}
}
/*断开底层连接,也就是这个客户端的socket链接
*/
setTimeout(() => socket.disconnect(true), 200);
console.log('断线', users)
});
});
/*
*关闭服务io.close();
*/
客户端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>how to use socket</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/socket.io/1.7.3/socket.io.min.js"></script>
</head>
<body>
<form action="#">
<input type="text" id="login_name" />
<input type="text" id="password" />
<button id="send">login</button>
<button id="loginout">loginout</button>
</form>
<ol></ol>
<form action="#">
<input type="text" id="text" />
<button id="sendmsg">send</button>
</form>
<script>
var socket;
var login_name;
// 1. 与服务器端建立连接
//const socket = io.connect("http://localhost:3000");
// 2. 监听send按钮点击的事件
$("#send").click(function () {
// // 获取输入的信息
login_name = $("#login_name").val().trim();
let password = $("#password").val().trim();
let data = {
login_name: login_name,
password: password,
};
$.get("http://localhost:9528/login", data, function (data, status) {
console.log(data);
if (data.status == 200) {
socket = io.connect("http://localhost:9528");
socket.on("message", (message) => {
if (login_name == message.fromId) {
$("ol").append("<li>我:" + message.msg + "</li>");
}
});
/*断开的回调*/
socket.on("disconnect", function () {
console.log("服务器端主动断开连接.");
});
}
});
//登录
});
$("#loginout").click(function () {
// 向服务器端断开信息
socket.disconnect();
//登录
});
$("#sendmsg").click(function () {
// // 获取输入的信息
let value = $("#text").val().trim();
// 向服务器端发送信息
socket.emit("message", { fromId: login_name, toId: "2", msg: value });
});
// socket.on('login', message => {
// console.log(message);
// });
</script>
</body>
</html>