Socket

什么时候用长连接
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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值