websocket chat + node.js - Skicka meddelande vid disconnect

Permalänk
Medlem

websocket chat + node.js - Skicka meddelande vid disconnect

Hej folket!

Har hittat ett websocket skript som körs med node.js.

Tänkte försöka lägga till ett meddelande till alla användare som är inne i chatten när en användare disconnectar. Men det verkar inte gå så bra för mig just nu och får inga felmeddelande eller något heller.

Så tänkte det fanns någon på forumet här som kunde ta en titt och säga mig vad jag gör för fel.
Håller på att bli galen xD

Här är orginalkoden: https://medium.com/@martin.sikora/node-js-websocket-simple-ch...

Och här är koden jag lagt till just nu
https://pastebin.com/tmVgFAMq

Permalänk
Medlem

Börja med att isolera problemet, loggas disconnect eventet i konsolen? På så vis vet du i första skede om du är innanför if satsen.

Sen skickar du ett event av typen disconnect till alla klienter, har du en listener för det?

Visa signatur

Macbook Pro C2D 15,4"

Permalänk
Medlem

@Hauk: Haj!

Har kodat om allt, men får fortfarande inte disconnect texten att fungera, men har kommit fram till att jag på något sätt måste göra en användarlista har bara inte kommit på hur än.

Permalänk
Datavetare

Om det enda du vill ha är ett meddelande till alla klienter om att en viss klient försvunnit kan du göra t.ex. detta (fungerar i alla fall i Ubuntu/Firefox men är långt ifrån någon JS-expert så ta allt jag skriver med en skopa salt)

--- a/nodejs/chat/chat-server.js +++ b/nodejs/chat/chat-server.js @@ -88,7 +88,21 @@ wsServer.on('request', function(request) { console.log((new Date()) + ' Received Message from ' + userName + ': ' + message.utf8Data); + send_msg(message, userName, userColor); - // we want to keep history of all sent messages - var obj = { - time: (new Date()).getTime(), - text: htmlEntities(message.utf8Data), - author: userName, - color: userColor - }; - history.push(obj); - history = history.slice(-100); - - // broadcast message to all connected clients - var json = JSON.stringify({ type:'message', data: obj }); - for (var i=0; i < clients.length; i++) { - clients[i].sendUTF(json); - } } } }); @@ -98,7 +112,6 @@ wsServer.on('request', function(request) { if (userName !== false && userColor !== false) { console.log((new Date()) + " Peer " + connection.remoteAddress + " disconnected."); + send_msg({utf8Data: "*** detached from server ***" }, userName, userColor); // remove user from the list of connected clients clients.splice(index, 1); // push back user's color to be reused by another user @@ -107,20 +120,3 @@ wsServer.on('request', function(request) { }); }); \ No newline at end of file + +function send_msg(message, userName, userColor) { + var obj = { + time: (new Date()).getTime(), + text: htmlEntities(message.utf8Data), + author: userName, + color: userColor + }; + // we want to keep history of all sent messages + history.push(obj); + history = history.slice(-100); + // broadcast message to all connected clients + var json = JSON.stringify({ type: 'message', data: obj }); + for (var i = 0; i < clients.length; i++) { + clients[i].sendUTF(json); + } +}

d.v.s. jag extraherade delen som skickar meddelandet till en egen funktion och anropar den både i det "normala" fallet och när en klient kopplat ned (skickar inte det till klienten som kopplat ned, hen vet nog redan det...).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

@Yoshman: Nu har jag suttit och felsökt, och varje gång jag använder, både din och min kod så får jag detta

This command that was used is unknown for me
Object { time: "[8:30]", text: "Tommy has connected to the server.", author: "Tommy" }

https://pastebin.com/mYNc7qDY - Så med andra ord körs else satsen

Permalänk
Datavetare
Skrivet av ThLoser:

@Yoshman: Nu har jag suttit och felsökt, och varje gång jag använder, både din och min kod så får jag detta

This command that was used is unknown for me
Object { time: "[8:30]", text: "Tommy has connected to the server.", author: "Tommy" }

https://pastebin.com/mYNc7qDY - Så med andra ord körs else satsen

För att vi ska titta på exakt samma sak, här är versionen jag använder:
chat-server.js
frontend.html

Har inte ändrat i chat-frontend.js.

Fanns en del buggar i chat-server.js (men det borde inte ge felet du ser tycker jag). T.ex. så försökte man göra en shuffle() funktion så här

colors.sort(function(a,b) { return Math.random() > 0.5; } );

det där är inte ens garanterat att någonsin bli klart, d.v.s. kan ge evighetsloop om man har tillräckligt mycket otur.

Var också lite drygt att HTML sidan inte kunde laddas ned från NodeJS servern, det är ju trots allt en HTML server som även pratar websocket. Så lade till det, bara peka webbläsaren mot http://localhost:1337 (krävs trivial ändring i chat-frontend.js så kan man lägga servern på en annan maskin).

Testa ovan, det fungerar du lysande för egen del.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

@Yoshman: Jo men det hade du rätt i! Nu fungerar ju den delen iallafall.

Så nu har jag meddelande när användaren disconnectar, ska nu sätta ihop ett när användaren connectar. Dock måste jag komma på hur jag gör för att få den till att inte skicka till användaren som connectar.