0
我正在開發基於websockets和webrtc的聊天。我想發送消息給所有連接的用戶,但發件人除外,但找不到合適的解決方案。更具體地說,我想向新用戶加入聊天的其他已連接用戶發送通知。 我試圖給每個連接的用戶一個唯一的ID,但第一個分配的ID由每個新用戶重新編寫,我無法區分用戶。Websockets:發送消息和通知給所有客戶,除了發件人
服務器:
// list of users
var CLIENTS=[];
var id;
// web server is using 8081 port
var webSocketServer = new WebSocketServer.Server({ port: 8081 });
// check if connection is established
webSocketServer.on('connection', function(ws) {
id = Math.random();
CLIENTS[id] = ws;
CLIENTS.push(ws);
ws.on('message', function(message) {
console.log('received: %s', message);
var received = JSON.parse(message);
if(received.type == "login"){
ws.send(message); // send message to itself
/* *********************************************************** */
/* *** Here I trying to check if message comes from sender *** */
sendNotes(JSON.stringify({
user: received.name,
type: "notes"
}), ws, id);
/* *********************************************************** */
}else if(received.type == "message"){
sendAll(message); // broadcast messages to everyone including sender
}
});
ws.on('close', function() {
console.log('user ' + CLIENTS[ws] + ' left chat');
delete CLIENTS[ws];
});
});
function sendNotes(message, ws, id) {
console.log('sendNotes : ', id);
if (CLIENTS[id] !== ws) {
console.log('IF : ', message);
for (var i = 0; i < CLIENTS.length; i++) {
CLIENTS[i].send(message);
}
}else{
console.log('ELSE : ', message);
}
}
function sendAll(message) {
for (var i=0; i < CLIENTS.length; i++) {
CLIENTS[i].send(message); // broadcast messages to everyone including sender
}
}
客戶:
loginButton.addEventListener("click", function(){
name = usernameInput.value;
if(name.length > 0){
socket.send(JSON.stringify({
type: "login",
name: name
}));
}
});
function sendData() {
var data = dataChannelSend.value;
var userName = document.getElementById('greetingUser').innerHTML;
socket.send(JSON.stringify({
username : userName, // fetch user name from browser, after login
type : "message",
message : data
}));
}
socket.onmessage = function(message) {
var envelope = JSON.parse(message.data);
switch(envelope.type) {
case "login":
onLogin(envelope);
break;
case "message":
showMessage(envelope);
break;
}
};
我將高度讚賞如果你能給我任何暗示。謝謝
感謝您的回答,我會盡快檢查您的答案 – johannesMatevosyan
它會拋出無效的非字符串緩衝區塊錯誤 – johannesMatevosyan
您是否更新了所有對CLIENTS的引用,並記住了我的更改,現在使用語法CLIENTS [string clientLoginName]。如果您能像以前一樣向我顯示您的更新代碼和錯誤的屏幕打印,那將會非常有幫助。 – whoshotdk