Forum: PC-Programmierung Javascript Zugriff auf Elemente des Arrays funktioniert nicht


von Netron (Gast)


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');

von Daniel A. (daniel-a)


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.

: Bearbeitet durch User
von Dirk D. (dicky_d)


Lesenswert?

Der Klassiker, Du machst ne Zuweisung statt einen Vergleich.
  if(this.list[i].addr = addr && this.list[i].port == port)

_______________________^

Versuchs da mit mit einem == :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.