Javascript NodeJS Websocket(ws)不同客户端之间如何通信?
我有2个客户端,我需要client1向client2提供信息,这会收到一个警报,我正在用NodeJS实现Websocket“ws” Client1网页通过AJAX接收答案,并以JSON格式将信息发送到server.js,如下示例: /mysite\u folder/client1/client1.phpJavascript NodeJS Websocket(ws)不同客户端之间如何通信?,javascript,json,node.js,ajax,websocket,Javascript,Json,Node.js,Ajax,Websocket,我有2个客户端,我需要client1向client2提供信息,这会收到一个警报,我正在用NodeJS实现Websocket“ws” Client1网页通过AJAX接收答案,并以JSON格式将信息发送到server.js,如下示例: /mysite\u folder/client1/client1.php <script> var userorder = $("#user").val(); //client2 username who will receive information
<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>
$(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){
}
});
解析JSON并比较信息状态为“已分配”的“我需要”info.user“发送到client2页面,显示一条警报消息,因此在client2中,我编写了如下示例:/mysite\u folder/client2/client2.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>
$(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仍然没有从服务器接收消息,也没有显示警报
我需要一些帮助。问题是您将数据发送回收到消息的同一套接字连接,即
ws.send(info.user)
,ws
仅指该客户端连接
服务器有一种方法,您可以使用它将消息发送到所有活动连接
wss.broadcast(info.user);
问题是您将数据发送回收到消息的同一套接字连接,即
ws.send(info.user)
,ws
仅指该客户端连接
服务器有一种方法,您可以使用它将消息发送到所有活动连接
wss.broadcast(info.user);
根据文档,我创建了一个广播函数,现在没有显示错误,但是client2仍然没有发生任何事情。@NekoLopez我直接链接到了代码,看起来库已经有了一个
broadcast
方法。无论哪种方式,这都是用于通知所有客户端的方法,您需要进行调试并确保您的客户端确实已连接&数据正在发送。客户端已连接,但广播似乎不起作用,我在if(info.status==“ASSIGNED”)之前添加了一行代码,显示控制台中的消息(console.log(“message sent to clients”))控制台没有显示任何内容根据文档,我创建了一个广播函数,现在没有显示错误,但client2仍然没有发生任何事情。@NekoLopez我直接链接到代码,看起来库已经有了一个broadcast
方法。无论哪种方式,这都是用于通知所有客户端的方法,您需要进行调试并确保您的客户端确实已连接&数据正在发送。客户端已连接,但广播似乎不起作用,我在if(info.status==“ASSIGNED”)之前添加了一行代码,显示控制台中的消息(console.log(“message sent to clients”))控制台什么也没显示