【问题标题】:NodeJS Websocket (ws) how communicate between different clients?NodeJS Websocket(ws)如何在不同客户端之间进行通信?
【发布时间】:2018-01-29 18:05:41
【问题描述】:

我有 2 个客户端,我需要客户端 1 向客户端 2 提供信息并收到警报,为此我正在使用 NodeJS 实现 Websocket“ws”。

Client1 网页通过 AJAX 接收答案,并以 JSON 格式将信息发送到 server.js,如下例所示: /mysite_folder/client1/client1.php

<script>
var userorder = $("#user").val(); //client2 username who will receive information

$.post("myscript.php",{
  my: variables
}).done(function(response){
var wsUri = "wss://www.mysite.com:3000/sockets/";
var output;

websocket = new WebSocket(wsUri);
websocket.onopen = onOpen; 
websocket.onclose = onClose; 
websocket.onmessage = onMessage;
websocket.onerror = onError;

function onOpen(evt){

output = {
 "status": "ASSIGNED",
 "user":  userorder
 };
 doSend(JSON.stringify(output));
}

function doSend(message){ 
 websocket.send(message);
 websocket.close();
}

function onMessage(evt){    
}

function onClose(evt){ 
 location.reload();
}

function onError(evt){
}
});

</script>

client1发送信息后,连接关闭并刷新client1页面。我的服务器收到这样的 JSON 信息:/mysite_folder/sockets/server.js

var WebSocketServer = require('ws').Server,
fs = require('fs');

var cfg = {
    ssl: true,
    port: 3000,
    ssl_key: '/path/of/sslkey',
    ssl_cert: '/path/of/sslcert'
};

var httpServ = ( cfg.ssl ) ? require('https') : require('http');

var app      = null;

var processRequest = function( req, res ) {
res.writeHead(200);
res.end("All glory to WebSockets!\n");
};

if ( cfg.ssl ) {

app = httpServ.createServer({

   // providing server with  SSL key/cert
   key: fs.readFileSync( cfg.ssl_key ),
   cert: fs.readFileSync( cfg.ssl_cert )

}, processRequest ).listen( cfg.port );

} else {
 app = httpServ.createServer( processRequest ).listen( cfg.port );
}

var wss = new WebSocketServer( { server: app } );
wss.on('connection', function connection(ws){
console.log("User connected");

 ws.on('message', function incoming(message){      
   var info = JSON.parse(message); //receive client1 info
   if(info.status=="ASSIGNED"){
     ws.send(info.user); //send client2 username
   }       
 });
});

解析 JSON 并比较该信息状态为“已分配”我需要将“info.user”发送到显示警报消息的客户端 2 页面,因此在客户端 2 中我写了这样的示例:/mysite_folder/client2/client2.php

$(document).ready(function(){
 var user = $("#user").val(); //client2 username

 var wsUri = "wss://www.mysite.com:3000/sockets/";
 var output;

 websocket = new WebSocket(wsUri);
 websocket.onopen = onOpen;
 websocket.onclose = onClose;
 websocket.onmessage = onMessage;
 websocket.onerror = onError;

 function onOpen(evt){
 }

 function doSend(message){
 }

 function onMessage(evt){ 
  if(user==evt){ //if client2 username sent by server is the same with client2 username logged in the page, make an alert
    alert("Your order was ASSIGNED");
  }
  websocket.close();
 }

 function onClose(evt){
 }

 function onError(evt){
 }
});

连接工作正常,client1 工作正常,但在 client2 中没有发生任何事情,我怎样才能让 client2 收到此警报?

更新

server.js 上我添加了这样的广播方法:

var wss = new WebSocketServer( { server: app } );

// Broadcast to all.
wss.broadcast = function broadcast(data) {
  wss.clients.forEach(function each(client) {
  if ( client.readyState == WebSocketServer.OPEN) {
    client.send(data);
  }      
  });
};

wss.on('connection', function connection(ws){
console.log("User connected");

ws.on('message', function incoming(message){

    //Broadcast to everyone else
    var info = JSON.parse(message);
    console.log(info.user); //shows username in console

    wss.clients.forEach(function each(client) {
      if (client !== ws && client.readyState === WebSocketServer.OPEN) {
        if(info.status=="ASSIGNED"){
            client.send(info.user);
        }
      }
    });     
});
});

但是 client2 仍然没有收到来自服务器的消息并且没有显示警报。

我需要一些帮助。

【问题讨论】:

    标签: javascript json node.js ajax websocket


    【解决方案1】:

    问题是您将数据发送回您收到消息的同一个套接字连接,即ws.send(info.user)ws 仅指该客户端连接。

    服务器有一个broadcast 方法,您可以使用该方法将消息发送到所有活动连接

    wss.broadcast(info.user);
    

    【讨论】:

    • 根据文档github.com/websockets/ws#broadcast-example ,我创建了一个广播功能,现在没有显示错误但client2仍然没有发生任何事情。
    • @NekoLopez 我已经直接链接到代码,看起来库已经有一个broadcast 方法。无论哪种方式,这是您用于通知所有客户端的方法,您需要调试并确保您的客户端确实已连接并且正在发送数据。
    • 客户端已连接,但似乎广播不起作用,我在 if(info.status=="ASSIGNED") 之前添加了一行,在控制台中显示一条消息 (console.log('Message sent to客户))和控制台什么也没有显示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多