【问题标题】:How to have multiple websocket connections using Nexmo如何使用 Nexmo 建立多个 websocket 连接
【发布时间】:2020-04-25 13:42:05
【问题描述】:

我在我的服务器中实现了 nexmo 提供的示例代码(如下)。但是,我遇到了一个问题,如果 2 个调用者 ping 我的服务器,第二个调用者的二进制数据也会流入同一个 websocket 端点;从而导致两个二进制流进入同一个 websocket 端点。我怎样才能实现nexmo,以便每个调用者都有自己的websocket来连接到代理?我相信 socket.io 是解决方案,但是我不熟悉它。

const express = require('express')
const app = express()
var bodyParser = require('body-parser');
app.use(bodyParser.json());
var expressWs = require('express-ws')(app);
var isBuffer = require('is-buffer')
var header = require("waveheader");
var fs = require('fs');
var file;



//Serve a Main Page
app.get('/', function(req, res) {
    res.send("Node Websocket");
});


//Serve the NCCO on the /ncco answer URL
app.get('/ncco', function(req, res) {

    var ncco = require('./ncco.json');
    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(ncco), 'utf-8');
});


//Log the Events
app.post('/event', function(req, res) {
    console.log(req.body);
    res.send("ok");
});

// Handle the Websocket
app.ws('/socket', function(ws, req) {
    var rawarray = []; 
    console.log("Websocket Connected")
    ws.on('message', function(msg) {
     if (isBuffer(msg)) {
             rawarray.push(msg);
     }
     else {
         console.log(msg); 
     }
    });
    ws.on('close', function(){
      console.log("Websocket Closed")
      file = fs.createWriteStream('./output.wav');
      file.write(header(16000 * rawarray.length/50 * 2,{
                        sampleRate: 16000,
                        channels: 1,
                        bitDepth: 16}));
      rawarray.forEach(function(data){
          file.write(data);
      });
  })
});

app.listen(8000, () => console.log('App listening on port 8000!'))

【问题讨论】:

    标签: javascript node.js websocket server nexmo


    【解决方案1】:

    它应该适用于您当前的实现,您需要进行一些更改。因此,不是每个 WebSocket 都进入同一个端点并写入同一个输出文件,而是需要在单独的路由上流式传输每个 WebSocket,并将每个输出保存到不同的文件中。将您的套接字路由更改为如下所示:

    app.ws('/socket/:identifier', function(ws, req) {
        var rawarray = []; 
        console.log("Websocket Connected")
        ws.on('message', function(msg) {
         if (isBuffer(msg)) {
                 rawarray.push(msg);
         }
         else {
             console.log(msg); 
         }
        });
        ws.on('close', function(){
          console.log("Websocket Closed")
          file = fs.createWriteStream('./' + req.params.identifier + '.wav');
          file.write(header(16000 * rawarray.length/50 * 2,{
                            sampleRate: 16000,
                            channels: 1,
                            bitDepth: 16}));
          rawarray.forEach(function(data){
              file.write(data);
          });
      })
    });
    

    要完成这项工作,您还需要更改 NCCO,而不是从磁盘读取静态文件,而是在路由中生成它。我不知道你在文件中到底有什么,但你可以按原样使用它并将套接字连接位更改为:

    app.get('/ncco', function(req, res) {
    
      var ncco = [
        {
          "action": "talk",
          "text": "Please wait while we connect you"
        },
        {
          "action": "connect",
          "eventUrl": [
            "https://yourserver.com/event"
          ],
          "from": "YOUR_NEXMO_NUMBER",
          "endpoint": [
            {
              "type": "websocket",
              "uri": "ws://yourserver.com/socket/" + req.query.from,
              "content-type": "audio/l16;rate=16000"
            }
          ]
        }
      ]
      res.writeHead(200, { 'Content-Type': 'application/json' });
      res.end(JSON.stringify(ncco), 'utf-8');
    });
    

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多