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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren