美文网首页小程序专栏微信小程序微信小程序
微信小程序和服务器通信-WebSocket

微信小程序和服务器通信-WebSocket

作者: 一斤代码 | 来源:发表于2016-11-01 09:53 被阅读11828次

    接上一篇文章的话题,我们这次来讲一下如何建立一个基于node.js的WebSocket服务器,并在小程序中使用这个提供实时服务的服务器。

    node.js中已经有很多现成的第三方库,用于构建WebSocket服务。我们今天选用一个叫做websocket的库,来构建一个可以提供标准WebSocket接口的node.js服务端程序。

    先建一个空文件夹,名叫ws-server,然后进入该文件夹,在命令行执行:

    npm install websocket
    

    然后在ws-server文件夹下,再新建一个名为app.js的文件,内容如下:

    const http = require('http')
    const WebSocketServer = require('websocket').server
    
    const httpServer = http.createServer((request, response) => {
        console.log('[' + new Date + '] Received request for ' + request.url)
        response.writeHead(404)
        response.end()
    })
    
    const wsServer = new WebSocketServer({
        httpServer,
        autoAcceptConnections: true
    })
    
    wsServer.on('connect', connection => {
        connection.on('message', message => {
            if (message.type === 'utf8') {
                console.log('>> message content from client: ' + message.utf8Data)
                connection.sendUTF('[from server] ' + message.utf8Data)
            }
        }).on('close', (reasonCode, description) => {
            console.log('[' + new Date() + '] Peer ' + connection.remoteAddress + ' disconnected.')
        })
    })
    
    httpServer.listen(8080, () => {
        console.log('[' + new Date() + '] Serveris listening on port 8080')
    })
    

    由于WebSocket服务是建立在HTTP之上的,因此我们从上面的代码中可以看到,代码先建立了一个http server, 然后再建立了一个使用该http server的WebSocket server,并让http server监听8080端口对外提供服务。

    这个服务端的功能也很简单,就是收到客户端发送的消息并打印出来,然后在接收到的消息前面加上一个[from server]的前缀后,返回给客户端。

    写完这个app.js后,通过以下命令把它运行起来:

    node app.js
    

    好,接着我们来实现一个调用该WebSocket服务的微信小程序端的代码:

    Page({
    
      onLoad: function (options) {
        wx.connectSocket({
          url: 'ws://localhost:8080'
        })
    
        wx.onSocketOpen(function (res) {
          console.log('WebSocket连接已打开!')
    
          wx.sendSocketMessage({
            data: 'Hello,World:' + Math.round(Math.random() * 0xFFFFFF).toString(),
          })
        })
    
        wx.onSocketMessage(function (res) {
          console.log(res)
        })
    
        wx.onSocketClose(function (res) {
          console.log('WebSocket连接已关闭!')
        })
      }
    
    })
    

    上面的代码中,我们首先需要用wx.connectSocket()方法去连接目标服务器,因为我们的开发环境用的是非安全的http,所以这里的url参数是ws://打头的。在微信的实际运行环境中,你的服务端必须使用SSL,因此连接url就会改成wss://。

    接着,需要调用wx.onSocketOpen()方法来设置WebSocket连接打开时的回调函数。当连接打开后,就可以开始向服务端发送数据了,我们在这里使用wx.sendSocketMessage()方法,向服务端发送了一个后面跟随一个随机数的Hello,World字符串。我们运行一下程序,可以看到,服务端的控制台上会打印出这样的结果:

    >> message content from client: Hello,World:16119566
    

    说明服务端已经成功接收到了客户端发送的字符串消息。

    之后服务端会向客户端再反馈这个消息,那客户端这边如何接收这个从服务端过来的消息呢?我们可以在小程序中,使用wx.onSocketMessage()方法,监听服务端发送到客户端的消息,正如我们上面的示例代码写的那样:

    wx.onSocketMessage(function (msg) {
          console.log(msg)
    })
    

    我们在小程序的Console上,简单的打印了从服务端过来的消息,如下所示:

    小程序Console

    这样,一个简单但完整的客户端和服务器端的WebSocket交互就算完成了。如果你想关闭这个WebSocket连接,可以调用wx.closeSocket()来进行关闭。

    好了,关于微信小程序和WebSocket服务器通信的例子,就讲到这里吧。不对之处,欢迎指正。

    谢谢大家阅读本文。

    相关文章

      网友评论

      • d1a32d8b80d6:自己开发小程序如果要上线,必须买腾讯云服务器吗?如果小程序比较简单,不需要搭建数据库什么的,也必须买腾讯云服务器才能上线吗?
        一斤代码:@白羊_e2e8 任何后端语言和框架都可以,没限制,按照文档里说明的方式去在你的后端调用腾讯的一些rest api获取需要的信息(比如openid, session_key等)。部署也不一定要腾讯云,阿里云、其他服务器提供商都可以。
        d1a32d8b80d6:@一斤代码 请教一下。比如我个人开发一个运动的小程序,需要将解密code发到后台解密,通过后台去请求微信的数据,这也是微信推荐的做法。那么我的后台怎么做呢?就是个普通的小网站,对外开放webservice接口,就可以了吗?然后将网站部署到腾讯云服务器上,对吗?网站语言和框架有什么限制吗?比如是否可以用c#,框架用mvc或者webservice
        一斤代码:需要后端程序支持的,那就需要服务器(不一定是腾讯云,其他云服务商的都可以)。
      • de021d808d8f:为什么我的没有from server?而是data:'server get message:...........'
      • 凌云风少:能实现 小程序里发送消息 图片 和 PC端同时接收发送吗
        一斤代码:这个当然可以的。
      • 丘空:我想问一下你这个是在VScode上进行操作的吗
        一斤代码:@丘空 控制硬件可以实现啊
        丘空:@一斤代码 这个可不可以实现控制硬件呢?只是能与服务端交互吗,在下是小白,不懂有点不好意思😣
        一斤代码:这个不限定任何编辑器的,你想用VSCode也是可以的
      • 37346521040e:大佬 弱弱问一句 我要直接连服务器那个url那块写wss://ip还是域名 我怎么 都连不上- -
        一斤代码:@NATAvidad 真机运行还是其他?
        37346521040e:@一斤代码 那我在域名后面加端口号提示我域名错误 不能加端口号 那这样怎么连接服务器使用websocket呢
        一斤代码:如果你是开发工具模拟器或真机debug模式的话,可以用ip(记得在开发工具中勾选上那个“不校验安全域名.....TSL版本以及HTTPS证书”选项);如果是真机运行,则一定要用域名(而且该域名是配置了合法的SSL证书的)。
      • 请赐予我一个昵称:你好,我是一个新手。想请问一下,不购买小程序的腾讯云服务器,但是申请了一个腾讯云,可以实现与本机小程序的通信吗?
      • 49f24d3a0195:请问下,这个怎么在手机上测试,wx.connectSocket({
        url: ''
        }) 这个url写127.0.1加端口号或者localhost加端口号没问题, 但是写ip地址就报错
        一斤代码:在手机上测试这种非正式域名的地址的话,需要在手机上打开小程序的“调试模式”,这样才能正常连接上这种ip地址。
      • 6eb6b04a60bd:膜拜 下!!
        但是我这里出现了一个问题,关闭socket的时候 ,用了wx.closewebsocket, 客户端也关闭是,服务端也监听了关闭,并且真是提示关闭了,但是关闭后主动再次熏连,connectsocket是提示链接成功 ,但是操作向服务端发信息的时候 ,却提示未链接,请大老帮帮忙
        一斤代码:在server端的connect事件里加上log,看看server端是不是正真接受并连接成功了
      • 056fbd274a3d:你好 就是我按照你得例子写好之后运行app.js 后没有反应 是我得操作步骤有问题吗
        056fbd274a3d:@一斤代码 这个案例对我很有帮助
        056fbd274a3d:@一斤代码 嗯嗯 谢谢 我的问题是那个ws域名的问题我的案例是写在申请的公众号的代码上的 用本地的localhost显示不出来 我自己建了一个本地的项目就可以了 谢谢
        一斤代码:运行app.js后命令行上会打印出一行如下的信息:
        [Wed Dec 06 2017 09:24:22 GMT+0800 (CST)] Serveris listening on port 8080

        如果出现该信息,说明服务端已经处于正常运行状态了。
      • 90778746588b:我又来请教您了,我是一个学生,现在在做一个项目中的手机微信小程序端模块,需要和服务器通信,后台服务器数据库这块是别人做的,所这个服务器端和我的小程序开发不在一台电脑上,我想问一下现在我要做到小程序与他的服务器简单通信(我的感觉就是类似于局域网,只有我的小程序和他的服务器之间的通信),而且不花钱买域名、证书,只是现阶段开发使用,可以实现吗?如果可以实现,对他的服务器有什么要求呢?希望大佬可以解惑。万分感谢!!!
        a445e62c328b:调试模式不需要域名和证书
      • 一斤代码:我们的高质量前端开发者微信群【前端精修社】欢迎前端开发者加入:
        http://www.jianshu.com/p/d9a0202bd257

      本文标题:微信小程序和服务器通信-WebSocket

      本文链接:https://www.haomeiwen.com/subject/aysputtx.html