NodeJS Websocket (ws) 如何在不同的客户端之间进行通信?



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

客户端 1 网页通过 AJAX 接收应答.js并以 JSON 格式将信息发送到服务器,如以下示例所示:/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>

客户端 1发送信息后,连接将关闭并刷新客户端 1 页面。我的服务器收到如下 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"发送到显示警报消息的 client2 页面,因此在 client2 中,我写了这样的示例:/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){
}
});

连接工作正常,客户端 1 运行良好,但在客户端 2 中没有发生任何事情,如何让客户端 2 收到此警报?

更新

服务器上.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 仍然没有从服务器接收消息并且不显示警报。

我需要一些帮助。

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

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

wss.broadcast(info.user);

相关内容

最新更新