websocket send message to user via json

  • websocket send message to user via json

    Hallo Leute,

    ich möchte gern per websocket mittels HTML Client über einen nodejs server einen unityclient steuern idealerweise mit feedback. Ich kann zwar jeweils mittels json eine verbindung aufbauen, aber ich komme nicht so richtig klar mit der "Userverwaltung". Irgendwie muss ich an die Connections den User binden, dem dann einen Namen zuweisen und dann über json parse dann aufrufen und eine Nachricht senden. Die Theorie ist soweit ganz schlüssig, aber es hapert an der Praxis bzw. Syntax. Hier mal mein bisheriger Code:

    JavaScript-Quellcode

    1. //===============================================
    2. // Websocket Command Server 1.0
    3. //===============================================
    4. // Websocket-Server
    5. var WebSocketServer = require('ws').Server
    6. var wss = new WebSocketServer({host: 'localhost',port: 1337});
    7. console.log('Server gestartet...');
    8. wss.on('connection', function(ws)
    9. {
    10. var userName = false;
    11. console.log('client verbunden...');
    12. ws.on('message', function(message)
    13. {
    14. if (userName === false) { // first message sent by user is their name
    15. // remember user name
    16. userName = message;
    17. console.log((new Date()) + ' Received Message from ' + userName + ': ' + message);
    18. }
    19. else { // log and broadcast the message
    20. var obj = JSON.parse(message);
    21. if("User" in obj) {
    22. // New client, add it to the id/client object
    23. var targetuser = obj.user;
    24. console.log('targetuser: ' + obj.user);
    25. }
    26. if ("Command" in obj){
    27. // Send data to the client requested
    28. var command = obj.command;
    29. console.log('Command: ' + obj.command);
    30. }
    31. else {
    32. console.log('nix im json');
    33. }
    34. targetuser.send(command);
    35. }});
    36. });
    Alles anzeigen
  • Ich hab zwar deine Erklärung nicht ganz verstanden, aber dein Quellcode hat mehrere Fehler. Folgender Korrekturversuch:

    JavaScript-Quellcode

    1. //===============================================
    2. // Websocket Command Server 1.0
    3. //===============================================
    4. // Websocket-Server
    5. var WebSocketServer = require('ws').Server
    6. var wss = new WebSocketServer({host: 'localhost',port: 1337});
    7. console.log('Server gestartet...');
    8. wss.on('connection', function(ws) {
    9. console.log('client verbunden...');
    10. ws.on('message', function(message) {
    11. if (!ws.userName) {
    12. ws.userName = message; /*Dem client-objekt wird der Username direkt zugewiesen.
    13. Bitte testen. Ich weiß nicht ob das bei 'ws' auch geht.*/
    14. console.log((new Date()) + ' Received Message from ' + ws.userName + ': ' + message);
    15. } else {
    16. var obj = JSON.parse(message);
    17. var targetuser;
    18. var command;
    19. if("user" /*Groß-/Kleinschreibung beachten*/ in obj) {
    20. targetuser = obj.user;
    21. console.log('targetuser: ' + obj.user);
    22. }
    23. if ("command" /*Groß-/Kleinschreibung beachten*/ in obj){
    24. command = obj.command;
    25. console.log('Command: ' + obj.command);
    26. }
    27. else {
    28. console.log('nix im json');
    29. }
    30. /*targetuser.send(command); //'targetuser' dürfte kein gültiger client sein
    31. und '.send()' nicht kennen*/
    32. if (targetuser && command) {
    33. var targets = wss.clients.filter(function(target) {
    34. return target.userName === targetuser; /*mit 'Array.prototype.filter()'
    35. suche ich hier nach den Clienten mit dem angegebenen Usernamen*/
    36. });
    37. if (targets.length >= 1) {
    38. targets[0].send(command);
    39. } else {
    40. console.log(targetuser + ' wurde nicht gefunden!')
    41. }
    42. /*Ich sende an den ersten User mit dem angegebenen Username.
    43. Alternativ kann man auch an alle clienten mit dem angegebenen
    44. Usernamen senden:
    45. targets.forEach(function(target) {
    46. target.send(command);
    47. });*/
    48. }
    49. }
    50. });
    51. });
    Alles anzeigen

    Ich glaube nicht, dass deine username variable hier richtig als closure aufgefasst werden würde. Deshalb habe ich den Username an den Websocket gebunden. Dadurch konnte ich später auch nach einem User filtern.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lichtjaeger ()

  • Entschuldigung, aber dass kann ich leider nicht nachvollziehen. Ich habe das ganze mal nachgestellt und folgenden Clienten verwendet:

    HTML-Quellcode: index.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>WS-Test</title>
    6. </head>
    7. <body>
    8. <input id="in" type="text"><button id="btn">Senden</button>
    9. <script>
    10. var ws = new WebSocket('ws://localhost:8080')
    11. var input = document.getElementById('in')
    12. var button = document.getElementById('btn')
    13. ws.onopen = function() {
    14. console.log('Connected');
    15. };
    16. button.onclick = function() {
    17. ws.send(input.value)
    18. }
    19. ws.onmessage = function(msg) {
    20. console.log('Received message from server: ' + msg.data)
    21. }
    22. </script>
    23. </body>
    24. </html>
    Alles anzeigen

    Als Server habe ich genau den bereits Angegebenen verwendet, nur die Zeile 6 habe ich angepasst nach var wss = new WebSocketServer({port: 8080});.

    Mein Ablauf sah so aus:

    (Abk: srv = Server-Konsole; clt=Client-Konsole)

    Server starten
    srv:Server gestartet...

    Client laden
    clt(???):Connected
    srv:client verbunden...

    Die erste Eingabe im Clienten war entsprechend ein Username: >test<
    srv:Fri Feb 05 2016 15:27:49 GMT+0100 (Mitteleuropäische Zeit) Received Message from test: test

    Als nächstes habe ich einen JSON-String versendet, der aber nur eine "user"-property hatte (kein "command"): >{"user":"test"}<
    srv:targetuser: test
    srv:nix im json

    Alles bestens! Jetzt mit "command": >{"user":"test", "command": "Hallo Welt"}<
    srv:targetuser: test
    srv:Command: Hallo Welt
    clt(test):Received message from server: Hallo Welt

    Also alles so wie es soll. Jetzt noch einen Clienten dazu:
    clt(???):Connected
    srv:client verbunden...

    Usernamen eingeben: >john<
    srv:Fri Feb 05 2016 15:27:49 GMT+0100 (Mitteleuropäische Zeit) Received Message from john: john

    Von 'john' aus folgende Nachricht versendet: >{"user":"test", "command": "Hallo test"}<
    srv:targetuser: test
    srv:Command: Hallo test
    clt(test):Received message from server: Hallo test


    Der Server geht also. Muss an deinem Clienten liegen.

    Ich weiß zwar nicht wofür du den ersten brauchst, aber ein Array mit allen angemeldeten Usern bekommst du mit der Zeile:
    wss.clients.map(function(ws) {return ws.userName;}).filter(function(name) {return name;}) (doppelte Einträge möglich)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Lichtjaeger ()