什么时候用长连接
1.实时刷新(轮询)
2.服务器端发起数据
时间换空间 空间换时间
1.轮询 1s 一次ajax
2.服务器推送
长连接(socket) 和 短连接(ajax)
api服务器(nodeapi:3000) web服务器(www:80http 443https) socket服务器 ftp服务器(文件上传22)
实现socket的方式
1. net
2. socket.io 麻烦 兼容性最好
3. websoket h5新增 低版本浏览器不兼容 使用方式简单
net 模块
serverCode
const net = require('net')
const server = new net.createServer()
let clients = {}
let clientName = 0
server.on('connection', (client) => {
client.name = ++clientName
clients[client.name] = client
client.on('data', (msg) => {
// console.log('客户端传来:' + msg);
broadcast(client, msg.toString())
})
client.on('error', (e) => {
console.log('client error' + e);
client.end()
})
client.on('close', (data) => {
delete clients[client.name]
console.log(client.name + ' 下线了');
})
})
function broadcast(client, msg) {
for (var key in clients) {
clients[key].write(client.name + ' 说:' + msg)
}
}
server.listen(9000)
clientCode
var net = require('net')
const readline = require('readline')
var port = 9000
var host = '127.0.0.1'
var socket = new net.Socket()
socket.setEncoding = 'UTF-8'
socket.connect(port, host, () => {
socket.write('hello.')
})
socket.on('data', (msg) => {
console.log(msg.toString())
say()
})
socket.on('error', function (err) {
console.log('error' + err);
})
socket.on('close', function () {
console.log('connection closeed');
})
const r1 = readline.createInterface({
input: process.stdin,
output: process.stdout
})
function say() {
r1.question('请输入:', (inputMsg) => {
if (inputMsg != 'bye') {
socket.write(inputMsg + '\n')
} else {
socket.destroy()
r1.close()
}
})
}
socket.io 后端
var express=require('express')
var app=express();
var server=require('http').Server(app)
var ws=require("socket.io")(server)
// 将socket服务器与express服务器进行结合
app.use(express.static(__dirname+'/client'))
//客户端链接
ws.on('connection',(client)=>{
client.on('haha',(msg)=>{
console.log('我来了'+msg)
});//后端存储的事件 前端触发 (和观察者模式差不多)
client.emit('hehe','啥时候结束啊')//后端触发 (和观察者模式差不多)
})
server.listen(8081,'0.0.0.0')//监听所有的端后好
socket.io 前端
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="../../node_modules/socket.io-client/dist/socket.io.js"></script>
</head>
<body>
<script>
var socket=io.connect("http://127.0.0.1:8081")
//链接服务器
socket.on('hehe',(msg)=>{
console.log('hehe'+msg)
})//前端存储的事件 后端触发 (和观察者模式差不多)
socket.emit('haha','欢迎光临')//前端触发的事件 后端触发 (和观察者模式差不多)
</script>
</body>
</html>
实现socket的步骤
5. 搭建socket 服务器
6. 前端进行连接
7. 前端主动发送数据
8. 后端主动发送数据
9. 断开链接
websocket实现广播 后端
//引入ws模块
const WebSocket=require('ws');
//创建websocket服务器
const ws=new WebSocket.Server({port:8080},()=>{
console.log('websocket start && listen at 8080')
})
let clients=[];
ws.on('connection',(client)=>{
clients.push(client);
client.send('后端发送的消息');//只能是字符串
client.on("message",(msg)=>{
console.log("来自前端的信息:"+msg)
if(msg.indexOf('广播')!=-1){
sendAll(msg);
}
})
client.on('close',(msg)=>{
console.log('前端断开了链接')
})
})
function sendAll(msg){
for(let index=0;index<clients.length;index++){
clients[index].send(msg);
}
}
websocket前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>websocket</title>
</head>
<body>
<input type="text" id="name">
<button onclick="search()">发送</button>
<script>
const ws=new WebSocket('ws://localhost:8080/');
ws.onopen=function(){
console.log('服务器已连接')
}
ws.onmessage=(msg)=>{
alert(msg);
console.log('来自服务器端的数据'+msg)
}
ws.onclose=()=>{
console.log('服务器关闭')
}
function search(){
let msg=document.getElementById('name').value;
ws.send(msg);
}
</script>
</body>
</html>