小程序server-3-搭建WebSocket 服务:

1.安装 Node 模块

使用 ws 模块来在服务器上支持 WebSocket 协议,下面使用 NPM 来安装:

  1. cd /var/www/wxpro
  2. npm install ws --save

2.实现 WebSocket 服务器

创建 websocket.js,实现 WebSocket 服务

  1. // 引入 ws 支持 WebSocket 的实现
  2. const ws = require('ws');
  3. // 导出处理方法
  4. exports.listen = listen;
  5. /**
  6. * 在 HTTP Server 上处理 WebSocket 请求
  7. * @param {http.Server} server
  8. * @param {wafer.SessionMiddleware} sessionMiddleware
  9. */
  10. function listen(server, sessionMiddleware) {
  11. // 使用 HTTP Server 创建 WebSocket 服务,使用 path 参数指定需要升级为 WebSocket 的路径
  12. const wss = new ws.Server({ server, path: '/ws' });
  13. // 监听 WebSocket 连接建立
  14. wss.on('connection', (ws,request) => {// 要升级到 WebSocket 协议的 HTTP 连接
  15. // 被升级到 WebSocket 的请求不会被 express 处理,
  16. // 需要使用会话中间节获取会话
  17. sessionMiddleware(request, null, () => {
  18. const session = request.session;
  19. if (!session) {
  20. // 没有获取到会话,强制断开 WebSocket 连接
  21. ws.send(JSON.stringify(request.sessionError) || "No session avaliable");
  22. ws.close();
  23. return;
  24. }
  25. // 保留这个日志的输出可让实验室能检查到当前步骤是否完成
  26. console.log(`WebSocket client connected with openId=${session.userInfo.openId}`);
  27. serveMessage(ws, session.userInfo);
  28. });
  29. });
  30. // 监听 WebSocket 服务的错误
  31. wss.on('error', (err) => {
  32. console.log(err);
  33. });
  34. }
  35. /**
  36. * 进行简单的 WebSocket 服务,对于客户端发来的所有消息都回复回去
  37. */
  38. function serveMessage(ws, userInfo) {
  39. // 监听客户端发来的消息
  40. ws.on('message', (message) => {
  41. console.log(`WebSocket received: ${message}`);
  42. ws.send(`Server: Received(${message})`);
  43. });
  44. // 监听关闭事件
  45. ws.on('close', (code, message) => {
  46. console.log(`WebSocket client closed (code: ${code}, message: ${message || 'none'})`);
  47. });
  48. // 连接后马上发送 hello 消息给会话对应的用户
  49. ws.send(`Server: 恭喜,${userInfo.nickName}`);
  50. }

编辑 app.js,调用 WebSocket 服务

  1. // HTTP 模块同时支持 Express 和 WebSocket
  2. const http = require('http');
  3. // 引用 express 来支持 HTTP Server 的实现
  4. const express = require('express');
  5. // 引用 wafer-session 支持小程序会话
  6. const waferSession = require('wafer-node-session');
  7. // 使用 MongoDB 作为会话的存储
  8. const MongoStore = require('connect-mongo')(waferSession);
  9. // 引入配置文件
  10. const config = require('./config');
  11. // 引入 WebSocket 服务实现
  12. const websocket = require('./websocket');
  13. // 创建一个 express 实例
  14. const app = express();
  15. // 独立出会话中间件给 express 和 ws 使用
  16. const sessionMiddleware = waferSession({
  17. appId: config.appId,
  18. appSecret: config.appSecret,
  19. loginPath: '/login',
  20. store: new MongoStore({
  21. url: `mongodb://${config.mongoUser}:${config.mongoPass}@${config.mongoHost}:${config.mongoPort}/${config.mongoDb}`
  22. })
  23. });
  24. app.use(sessionMiddleware);
  25. // 在路由 /me 下,输出会话里包含的用户信息
  26. app.use('/me', (request, response, next) => {
  27. response.json(request.session ? request.session.userInfo : { noBody: true });
  28. if (request.session) {
  29. console.log(`Wafer session success with openId=${request.session.userInfo.openId}`);
  30. }
  31. });
  32. // 实现一个中间件,对于未处理的请求,都输出 "Response from express"
  33. app.use((request, response, next) => {
  34. response.write('Response from express');
  35. response.end();
  36. });
  37. // 创建 HTTP Server 而不是直接使用 express 监听
  38. const server = http.createServer(app);
  39. // 让 WebSocket 服务在创建的 HTTP 服务器上监听
  40. websocket.listen(server, sessionMiddleware);
  41. // 启动 HTTP 服务
  42. server.listen(config.serverPort);
  43. // 输出服务器启动日志
  44. console.log(`Server listening at http://127.0.0.1:${config.serverPort}`);

3.编辑 Nginx 配置 ssl.conf,添加 WebSocket 支持

  1. #WebSocket 配置
  2. map $http_upgrade $connection_upgrade {
  3. default upgrade;
  4. '' close;
  5. }
  6. server {
  7. listen 443;
  8. server_name www.example.com; # 改为绑定证书的域名
  9. #ssl 配置
  10. ssl on;
  11. ssl_certificate 1_www.example.com.crt; # 改为自己申请得到的 crt 文件的名称
  12. ssl_certificate_key 2_www.example.com.key; # 改为自己申请得到的 key 文件的名称
  13. ssl_session_timeout 5m;
  14. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  15. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  16. ssl_prefer_server_ciphers on;
  17. #WebSocket 配置
  18. proxy_set_header Upgrade $http_upgrade;
  19. proxy_set_header Connection $connection_upgrade;
  20. location / {
  21. proxy_pass http://127.0.0.1:8765;
  22. }
  23. }
  1. nginx -t
  2. nginx -s reload

小程序server-3-搭建WebSocket 服务的更多相关文章

  1. 小程序开发之搭建WebSocket的WSS环境(Apache+WorkerMan框架+PHP)

    最近公司的一个IoT项目用到了小程序的WSS协议环境,现在把整个的搭建开发过程分享给大家. 这里我们用的是WorkerMan框架,服务器是CentOS,Web服务器是Apache,开发语言是PHP. ...

  2. 小白之微信小程序第一次完成搭建本地服务与页面进行交互

    如果忘记了搭建json-server的过程,可看上一篇随笔 1. index.xml  代码 <!--index.wxml--> <swiper indicator-dots=&qu ...

  3. 微信小程序使用GoEasy实现websocket实时通讯

    不需要下载安装,便可以在微信好友.微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好东西~ 同时因为微信小程序使用的是Jav ...

  4. TODO:小程序开发环境搭建

    TODO:小程序开发环境搭建 1.第一步当然是要先注册小程序了 2.登录到小程序 a)完善小程序信息,如名称,图标,描述 3.绑定开发者 4.获取AppID,并设置服务器信息 5.下载并安装开发者工具 ...

  5. 【阿里云】在 Windows Server 2016 下使用 FileZilla Server 安装搭建 FTP 服务

     Windows Server 2016 下使用 FileZilla Server 安装搭建 FTP 服务 一.安装 Filezilla Server 下载最新版本的 Filezilla Server ...

  6. 微信小程序中如何使用WebSocket实现长连接(含完整源码)

    本文由腾讯云技术团队原创,感谢作者的分享. 1.前言   微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架.组件以及 API,在这个平台上面的想象空间很大.腾讯云研究了一番之后,发现 ...

  7. 前端笔记之微信小程序(四)WebSocket&Socket.io&摇一摇案例&地图|地理位置

    一.WebSocket概述 http://www.ruanyifeng.com/blog/2017/05/websocket.html Workerman一款开源高性能异步PHP socket即时通讯 ...

  8. 微信小程序Server端环境配置

    主要内容:1. SSL免费证书申请步骤2. Nginx HTTPS 配置3. TLS 1.2 升级过程 微信小程序要求使用 https 发送请求,那么Web服务器就要配置成支持 https,需要先申请 ...

  9. Netty 搭建 WebSocket 服务端

    一.编码器.解码器 ... ... @Autowired private HttpRequestHandler httpRequestHandler; @Autowired private TextW ...

  10. 微信小程序一步步搭建商城系列-01-开篇

    1.小程序介绍 小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用.也体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题.应用将无处不 ...

随机推荐

  1. spring + springmvc+ mybatis 事务管理及控制

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  2. scrapy架构初探

    scrapy架构初探 引言 Python即时网络爬虫启动的目标是一起把互联网变成大数据库.单纯的开放源代码并不是开源的全部,开源的核心是"开放的思想",聚合最好的想法.技术.人员, ...

  3. Python原理 -- 深浅拷贝

    python原理 -- 深浅拷贝 从数据类型说开去 str, num : 一次性创建, 不能被修改, 修改即是再创建. list,tuple,dict,set : 链表,当前元素记录, 下一个元素的位 ...

  4. stringsteam使用之整型转字符串

    最近需要用到整型转字符串的操作,学习了stringstream一些皮毛. 首先需要包含头文件. #include<sstream> 然后用流操作的方式将值传递给stringstream对象 ...

  5. PHP实现简单的评论与回复功能还有删除信息

    我们首先先看一下功能 上面黑色的是评论的下面红色的字体是回复的 再来看看怎么实现的 1.发布评论 <form action="pinglunchili.php" method ...

  6. 论MyBatis日志

    Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具: SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 具体选择哪个日志 ...

  7. Unity应用架构设计(13)——日志组件的实施

    对于应用程序而言,日志是非常重要的功能,通过日志,我们可以跟踪应用程序的数据状态,记录Crash的日志可以帮助我们分析应用程序崩溃的原因,我们甚至可以通过日志来进行性能的监控.总之,日志的好处很多,特 ...

  8. (转载)java基础:关于java流与文件操作

    原文摘自: http://www.blogjava.net/haizhige/archive/2008/08/03/219668.html 1.描述:流是字节数据或字符数据序列. Java采用输入流对 ...

  9. User implements HttpSessionBindingListener

    public class User implements HttpSessionBindingListener { private int id; private String userName; p ...

  10. Building Apps for Windows 10 on LattePanda–Jump Start

    1.引言 目前来看,LattePanda应该是最小的运行Full Windows 10系统的开发板了(注意,不是Windows 10 for Mobile,也不是Windows 10 IoT系列,而是 ...