WebSocket使用

一种网络通信协议(握手阶段使用的是http 1.1),如果需要服务端主动向客户端推送信息可以使用它。

     

是什么

一种网络通信协议(握手阶段使用的是http 1.1),如果需要服务端主动向客户端推送信息可以使用它。

优势

  • 全双工,服务端和客户端可以互通消息。

  • 相对于各种论询,不仅省掉多次握手消耗,节省带宽资源,而且不用多次去询问是否有新数据可消耗。

存在的问题

  • 需要服务端配合,学习成本高些

  • 如果需要获取新数据的频次少,一直保持链接的话,浪费服务器资源。

使用方式(ps: 我使用的是本地nginx,自己生成的证书,密钥)

技术方案:nodejs + nginx + 微信小程序

hosts文件配置:

127.0.0.1 localhost
127.0.0.1 www.test.com
 

服务端:

var express = require('express');
var ws = require('ws');
const http = require('http'); 
var server = http.createServer(express()); 

/** * 创建websocket服务 */
const wss = new ws.createServer({ server, path: '/wss' }, ws => {
  serveMessage(ws);
});

/** * 监听websocket服务错误 */
wss.on('error', (err) => {
  console.log(err);
});

/** * 进行简单的 WebSocket 服务,对于客户端发来的所有消息都回复回去 */
function serveMessage(ws) {
  // 监听客户端发来的消息
  ws.on('message', (message) => {
console.log(`WebSocket received: ${message}`);
ws.send(`Server: Received(${message})`);
  });

  // 监听关闭事件
  ws.on('close', (code, message) => {
console.log(`WebSocket client closed (code: ${code}, message: ${message || 'none'})`);
  });

  // 连接后马上发送成功响应
  ws.send(`Server: 收到我的消息了嘛`);
}

server.listen(8888);

nginx配置(ps: 如果只是调试的话也可以使用80端口):

server {
    server_name www.test.com;
    listen 443;
    ssl on;
    ssl_certificate      xxx.crt; # 证书
    ssl_certificate_key  yyy.key; # 密钥,生成方式可自行搜索

    access_log   /usr/local/etc/nginx/access.log; # 记录访问日志
    error_log   /usr/local/etc/nginx/error.log; # 记录错误日志

    proxy_read_timeout 10s; #设置超时时间,防止node服务就是挂的
    proxy_connect_timeout 5s; #设置超时时间,防止node服务就是挂的

    location /wss {
        proxy_pass http://localhost:8888;
        proxy_http_version 1.1; # 必需
        proxy_set_header Upgrade $http_upgrade; # 必需
        proxy_set_header Connection $connection_upgrade; # 必需
        proxy_set_header Host $host; # 非必需
        proxy_set_header X-Real-IP $remote_addr; # 非必需
        proxy_set_header X-Real-Port $remote_port; # 非必需
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 非必需
        proxy_set_header X-Forwarded-Protocol "$scheme"; # 非必需
    }
    
    location / {
        proxy_pass http://localhost:999;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Protocol $scheme;
        }
}

小程序客户端(ps: 具体使用语法可以查看mp.weixin.qq.com官方小程序文档):

wx.connectSocket({
  url: 'wss://www.test.com/wss',
  data: {
    message: 'test'
  },
  success: function (res) {
    console.log('成功了', res);
  },
  fail: function () {
    console.log('失败了');
  }
});
wx.onSocketOpen(function (res) {
  //balabala,可以向服务端发消息了
}
wx.onSocketMessage(function(data) {
  //接收到服务端消息,balabala
}
wx.onSocketError(function (res) {
  //socket错误,balabala
}

遇到的问题

  • websocket 客户端自动关掉链接:原因是长时间不和websocket服务端交流,超过了nginx设置的proxy_read_timeout时间就自动关闭了,如果想长时间链接,可以采用setTimeout等类似工具判断断了重链。

  • upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server:…: 如果nginx确保没错,多半是websocket server的原因,比如我的,解决方法就是把node中socket.io模块换成了ws模块。

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

【小程序源码网资源版权风险说明】:
本站为避免不必要的纷争,分享的所有资源中一切可能有版权风险的资源将全部转载自第三方网站或平台,站长只为大家提供相关资源的介绍和跳转引导。 因可能有疏忽大意,所以如有遗漏资源侵犯了您的合法权利,请联系站长删除。
【小程序源码网资源下载使用说明】:
本站所分享的一切QQ小程序源码,thinkphp整站源码,微信小程序源码,图文教程等资源仅供用户学习参考使用,任何人不得作其他用途,违者自行承担所有责任。
【小程序源码网毫无人看的介绍】:
本站又称Z站,原名贼娘网,开站于2018年,换过三任站长,目前站长是第四任站长,本站是一个主要分享免费开源小程序源码/网站源码/免费素材/教程资源的网站,主要小程序资源有用于学习的小程序源码,也有正版原创可商用的小程序源码,是一个公益博客型网站。
【小程序源码网原创源码版权申明】:
未经小程序源码网许可,任何人不得擅自使用本站原创首发源码进行商业行为(除本站VIP用户在期限内,版权无使用限制),否则将依法承担相应赔偿责任。
【小程序源码网转载文章版权申明】:
本站所转载的QQ小程序或微信小程序源码与其他资源仅供学习,任何人不得作其他用途,违者自行承担所有责任。
【小程序源码网站长最后的屁话】:
如有您认为本站有任何侵犯您合法权益的文章,或者您有什么疑问需求,欢迎联系站长QQ,站长24小时在线,备注公司名称和源码版权问题或者需要小程序定制开发等站长业务类型可急速处理,如果您只是交流小程序的一些开发问题或源码问题可以加入QQ群讨论,就不用加站长啦,对于白嫖党,QQ群才是处理问题的天堂,当然站长也欢迎大家骚扰~
小程序源码网 » WebSocket使用
嘿,投喂下嘛!