[英]How to have multiple websocket connections using Nexmo
我在我的服務器中實現了 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!'))
它應該適用於您當前的實現,您需要做一些更改。 因此,不是每個 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');
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.