简单的 Node.js 套接字服务器

3
我正在尝试创建一个简单的node.js服务器,允许我的基于socket的iOS应用将其GPS坐标发送到服务器,然后服务器会向所有已连接的iOS客户端广播该GPS坐标。同样地,客户端也是使用sockets与服务器连接。我尝试使用Heroku web服务器的一些示例代码。代码已经被编辑以包括ANURAG的答案。
var WebSocketServer = require("ws").Server
var http = require("http")
var express = require("express")
var app = express()
var port = process.env.PORT || 5000

app.use(express.static(__dirname + "/"))

var server = http.createServer(app)
server.listen(port)

console.log("http server listening on %d", port)

var wss = new WebSocketServer({server: server})
console.log("websocket server created")

var connectionList = [];

wss.on("connection", function(ws) {
    console.log("connection");
  connectionList.push(ws);
})

wss.on("message", function(data, id) {
    var mes = server.unmaskMessage(data);
    var str = server.convertToString(mes.message);
    console.log(str);
    var i;
    for(i = 0; i < connectionList.lenth; i++) {
         wss.sendMessage(one, str, connectionList[i]);
    }
});

我该如何修改这段代码,以便能够通过套接字接收来自我的应用程序的消息,然后将该消息发送给所有其他已连接的iOS客户端。(该消息只是一个简单的字符串)
额外问题:由于Heroku要求您使用其环境端口(而不是您指定的端口),所以在我的iOS应用程序中,当我连接到服务器时,我只需指定在启动服务器时打印到控制台的端口即可。
感谢任何帮助!:)
编辑:对于向客户端广播,代码如下:
wss.on('connection', function(ws) {
  ws.on('message', function(message) {
    wss.broadcast(message);
  });
});

然而,我应该如何从客户端接收消息,并将接收到的消息作为要广播给其他客户端的消息。

2个回答

3

在获取连接后,您需要存储这些连接。然后,您可以使用这些连接向连接到您的服务器的所有设备发送消息。您可以尝试以下内容:

var connectionList = [];
wss.on("connection", function(ws) {
  connectionList.push(ws);
})

wss.on("message", function(data, id) {
    var mes = server.unmaskMessage(data);
    var str = server.convertToString(mes.message);
    console.log(str);
    var i;
    for(i = 0; i < connectionList.lenth; i++) {
         wss.sendMessage(one, str, connectionList[i]);
    }
});

点击此处阅读更多:https://www.npmjs.com/package/websocketserver


谢谢您的回答!当我将您的代码添加到项目中(请查看编辑后的代码)时,我尝试使用telnet在端口5000上本地测试代码,但是我无法连接到服务器。您是否也遇到了同样的问题? - Aimee
1
@Aimee:我并不是打算给你一个可用的解决方案,而是想给你一个实现方法的想法,这样你就可以自己做了。 - Anurag Peshne

1
以下是完整的index.js代码,以便服务器向客户端广播接收到的消息:
var WebSocketServer = require("ws").Server
var http = require("http")
var express = require("express")
var app = express()
var port = process.env.PORT || 5000

app.use(express.static(__dirname + "/"))

var server = http.createServer(app)
server.listen(port)

console.log("http server listening on %d", port)

var wss = new WebSocketServer({server: server})
console.log("websocket server created")

wss.broadcast = function(data) {
  for (var i in this.clients)
    this.clients[i].send(data);
};


wss.on("connection", function(ws) {

  console.log("websocket connection open");

  ws.on('message', function(message) {
    console.log("message received by server");
    wss.broadcast(message);
    })

  ws.on("close", function() {
    console.log("websocket connection close")
  })
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接