Javascript Zugriff auf Elemente des Arrays funktioniert nicht

Gast #4252805
Lesenswert?
• ▲
▼
Hallo,

ich bin ein Neuling in der NodeJS Entwicklung und habe eine Frage. Ich 
habe mir einen kleinen Server geschrieben, der die Ports und Adressen 
der Clients mitloggen soll. Diese werden in einer globalen Variable 
gespeichert.

Leider verhält es sich so, dass die bei mehrmaligen Empfangen von 
Nachrichten die Adressen im Array verloren gehen. Es ist immer nur die 
Adresse des letzten Pakets gespeichert. Kann mir da jemand weiterhelfen? 
Wahrscheinlich habe ich ein grundsätzliches Problem beim Verständnis von 
Javascript. Die Ausgabe nach drei Nachrichten sieht wie folgt aus:

Server listening on 255.255.255.255:7772
new client at 192.168.178.23:47696
[ { addr: '192.168.178.23', port: 47696 } ]
new client at 192.168.178.23:35086
[ { addr: false, port: 47696 },
  { addr: '192.168.178.23', port: 35086 } ]
new client at 192.168.178.23:38922
[ { addr: false, port: 47696 },
  { addr: false, port: 35086 },
  { addr: '192.168.178.23', port: 38922 } ]

1
var net = require('net');
2
var dgram = require('dgram');
3

4
function ClientList () {
5
    this.list = [];
6
    
7
  this.add = function (addr, port) {
8
    var obj = {
9
      addr: addr,
10
      port: port
11
    };  
12
    this.list.push(obj);    
13
  };
14
  
15
  this.find = function (addr, port) {
16
    for (i = 0; i < this.list.length; i++) {
17
      if(this.list[i].addr = addr && this.list[i].port == port)
18
        return true;
19
    }
20
    return false;
21
  };
22
}
23

24
var clients =  new ClientList();
25
var server = dgram.createSocket('udp4');
26

27
server.on('listening', function () {
28
    var address = server.address();
29
    console.log('UDP Server listening on ' + address.address + ":" + address.port);
30
});
31

32
server.on('message', function (message, remote) {
33
      
34
  if(clients.find(remote.address, remote.port) == false)
35
  {      
36
    console.log("new client at " + remote.address + ':' + remote.port );
37
    
38
    clients.add(remote.address, remote.port);
39
    
40
    console.log(clients.list);    
41
  }
42
  
43
});
44
server.bind(7772, '255.255.255.255');
#4253035
Lesenswert?
• ▲
▼
Diese client detections methode ist sehr unzuverlässig. Ich würde eine 
Session variable einführen. Der fehler ist ein Tippfehler:

Ersetze:
> this.list[i].addr = addr && this.list[i].port == port
Durch:
this.list[i].addr == addr && this.list[i].port == port

PS: JS bietet auch möglichkeiten das versehentliche verändern von werten 
zu verhindern. Object.seal und Object.freeze zum beispiel. Dann gibt es 
Object.defineProperty für komplexere Dinge und seit ECMAScript 6 aka 
JS1.7.8 ein const keyword.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.