• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] socket.io und client Verwaltung??

Paykoman

New member
Hallo Forum,

ich bin noch ganz neu auf dem webSocket Gebiet aber mein Server läuft immer hin schon und auch meine test events kommunizieren nun miteinander.
So ist meine nächste Aufgabe das protokollieren der verbundenen User und nach dem serversetitig ein user validiert wurde ggf. ein paar Daten zur user unique_id abspeichern, zu mal ich die user ID des socket-servers brauche damit ich dann später gezielt einzelne User anspreche und nicht immer an alle sende =)

Nun gut, mein Server schaut atm so aus:
Code:
// Require HTTP module (to start server) and Socket.IO
var http = require('http');
var io = require('socket.io');
var port = 8080;
 
// Start the server at port 8080
var server = http.createServer(function(req, res){
    // Send HTML headers and message
    res.writeHead(200,{ 'Content-Type': 'text/html' });
});
 
server.listen(port);
 
// Create a Socket.IO instance, passing it our server
var socket = io.listen(server);
 
// Add a connect listener
socket = socket.of('/root'); // set namespace
socket.on('connection', function(socket){
    console.log( 'Connection to client established');
	//console.log( io.of('/root').clients() );
    
    // der Client ist verbunden
	socket.emit('receiveFromServer', { text: 'Der server hat dir Hallo gesendet!' });
	
	// wenn Element geklickt wurde
	socket.on('klicked', function (data) {
	    console.log('klicked'); // klick erhalten
		// sende bestätigung zurück
		socket.emit('klicked', { text: data.text });
	});
});
console.log('Juhu Server running at Port:' + port + '/');


So nun habe ich bissl gegoogled und es scheint man muss ein namespace oder einen room (oder beides) nutzten um clients() Funktion nutzten zu können.

Da wäre ich zu nächst dankbar wenn Jemand sagen könnte ob ich den namespace so richtig setze oder ob das evtl. mein Problem ist, funktionieren tut es so jedenfalls, der Client verbindet sich auch mit dem namespace "/root" und auch die klick Sachen funktionieren!

Aber die clients() funktion zum anzeigen der verbundenen user geht leider immer noch nicht.
Folgendes habe ich ausprobiert (2 Zeilen unter connect wird getestet, hier ausgeklammert).

Tests
Code:
console.log( io.of('/root').clients() );
console.log( io.sockets.of('/root').clients() );
console.log( io.socket.of('/root').clients() );
console.log( socket.of('/root').clients() );
console.log( socket.clients() );

Jedes mal sagt er die function of() ist undefined ausser beim letzten mal da ist clients() undefined.
Nun habe ich gelesen das es wohl einige Änderung in diesem Bereich gab aber eine Lösung habe ich leider nicht gefunden =(

Ich hoffe mir kann jemand weiterhelfen.

MFG: Paykoman
 
Zuletzt bearbeitet:
Aber die clients() funktion zum anzeigen der verbundenen user geht leider immer noch nicht.
Folgendes habe ich ausprobiert (2 Zeilen unter connect wird getestet, hier ausgeklammert).
da wurde kräftig drann gedreht - und die doku ist ... ähm ... gewöhnungsbedürftig.
vermutlich hast du in eine alte doku gesehen und die neue socket.io
Socket.IO
Code:
console.log( io.of('/root').connected );
 
Leider bleibt der Fehler "of() is undefined" =(

Unter Umständen eben doch die namespace?
Eigentlich habe ich gesehen sollte dieser auch mit io.of('/root') gesetzt werden ging aber eben auch nicht darum habe ich es wie oben umgesetzt...


::EDIT::
eigentlich sollte ja auch das io property sockets existieren, tut es auch nciht habe direkt nach dme connecten mal log( sockets ) gemacht aber is undefined, iwas ist da total mist an der art und Weise wie die Verbindung hergestellt wird aber es war auch das einzige wo es mal geklappt hat =(
 
Zuletzt bearbeitet:
du hast scheinbar eine alte version und probleme mit deinen variablen

Code:
var [B]socket [/B]= io.listen([B]socket [/B]);
[B]socket [/B]= socket.of('/root'); // set namespace
socket.on('connection', function([B]socket [/B]){

die erste brauchst du

Code:
var [B]io[/B]= io.listen(server);
[B]socket [/B]= socket.of('/root'); // set namespace
[B]socket[/B].on('connection', function(socket){
oder gleich
Code:
var io = require('socket.io').listen(80);

und dann

Code:
console.log( io.of('/root').clients() );
 
Ok ich werde es morgen mal ausprobieren. Naja weitestgehens hatte ich schon nach aktuellen Versionen geschaut aber auch das werde ich morgen noch mal prüfen.

Habe dir aber auch ne PN geschickt, schau mal bitte =)

MFG: Pay
 
So hier bin ich noch mal,

also das mit dem Server klappt alles hinten und vorne nicht, abgesehen von den Basis-Funktionen aber sobald ich etwas spezielles brauche zickt er einfach überall rum =(
Das Thema hält jetzt schon die ganze Woche die Weiterentwicklung des Projekts auf und es wäre toll wenn mir Jemand per Skype helfen würde, so könnten wir kurz telefonieren und schneller zu einer Lösung kommen.
Ich würde auch einen Obolus dafür zahlen.

MFG: Paykoman
PS: paykomanvll in skype
 
Gut dann eben doch alles schiftlich -,-

du hast scheinbar eine alte version und probleme mit deinen variablen

Code:
var [B]socket [/B]= io.listen([B]socket [/B]);
[B]socket [/B]= socket.of('/root'); // set namespace
socket.on('connection', function([B]socket [/B]){

die erste brauchst du

Code:
var [B]io[/B]= io.listen(server);
[B]socket [/B]= socket.of('/root'); // set namespace
[B]socket[/B].on('connection', function(socket){
oder gleich
Code:
var io = require('socket.io').listen(80);

und dann

Code:
console.log( io.of('/root').clients() );

Für Jemand der wirklich noch nie mit Socket.io gearbeitet ist wäre es hilfreich einfach eine gesamte initialisierung des Servers darzustellen (also variablen mäßig, nicht die tracking funktionen und son Zeug), denn da so wieso schon Varibale/Funktions Probleme bestehen verwirrt das bloß noch mehr..

Variante #1:
Nun wird kein var socket = ...; erzeugt woher soll das skript nun socket nehmen, denn er sagt diese ist undefined wenn ich den namespace setzten möchte

Variante #2:
muss nicht listen(server) ? wie gehts weiter? Wie gesagt Verwirrung pur...


Letzlich geht es ja nur darum das eine korrekte Initialisierung des Server vorgenommen wird...
Code:
var server = require('http').createServer();
var io = require('socket.io').listen(server),
	mysql = require("mysql"),
	squel = require("squel"),
    memcache = require("memcache");
//    co = require("cookie-parser");

function parseCookies (request) {
	// kommt später...
}

// nur zum testen
var cookies = 'test';

function handler(req, res){
	cookies = 'foo';
    console.log('run server handler');
}
 
// Create a Socket.IO instance, passing it our server
//var socket = io.listen(server);
 
// Add a connect listener
socket = socket.of('/root'); // set namespace
socket.on('connection', function(socket){
	console.log(cookies);
    // meine Funktionen, soweit muss man jedoch ers ma kommen :D
});
 
console.log('Juhu Server running at Port:' + port + '/');

::EDIT::
Wobei ich atm die Port-Einstellung nicht untergebracht bekommen habe.
Wiegesagt mal kurz skypen wäre wesentlich angenehmer, snippetes per pastebin tauschen und er würde sicher in unter 30 Minuten lauffähig sein xD

::EDIT 2::
Code:
// Require HTTP module (to start server) and Socket.IO
var server = require('http').createServer();
var io = require('socket.io').listen('8080'),
	mysql = require("mysql"),
	squel = require("squel"),
    memcache = require("memcache");
//    co = require("cookie-parser");

function parseCookies (request) {
	// kommt später...
}

// nur zum testen
var cookies = 'test';

function handler(req, res){
	cookies = 'foo';
    console.log('run server handler');
}
 
// Create a Socket.IO instance, passing it our server
var socket = io.listen(server);
socket = socket.of('/root'); // set namespace
socket.on('connection', function(socket){
	console.log(cookies);
	console.log( io.socket.of('/root').clients() );
    // meine Funktionen, soweit muss man jedoch ers ma kommen :D
});
 
console.log('Juhu Server running');

So läuft er zwar wieder, aber behoben ist das mit den Clients nicht...
Die server handler funktion ist auch verwirrend, sollte die nicht vor unserem io.listen() ausgeführt werden, es überschriebt nämlich nicht den Inhalt von cookies wenn ichs nachm starten ausgebe, das is nämlich das nächste Thema =)
 
Zuletzt bearbeitet:
Für Jemand der wirklich noch nie mit Socket.io gearbeitet ist wäre es hilfreich einfach eine gesamte initialisierung des Servers darzustellen (also variablen mäßig, nicht die tracking funktionen und son Zeug), denn da so wieso schon Varibale/Funktions Probleme bestehen verwirrt das bloß noch mehr..
???
hab dein test mal zum laufen gebracht:

server.js
Code:
// Require HTTP module (to start server) and Socket.IO
var http = require('http');
var url = require('url'); 
var fs = require('fs'); 
var port = 8080;

// Start the server at port 8080
var server = http.createServer(handler);
server.listen(port);

function handler (request, response)
{
  console.log(request.url);
  if (request.url == '/')
  {
    fs.readFile(__dirname + '/index.html', 'utf-8', function (error, data)
    {
      if (error)
      {
        response.writeHead(500);
        return response.end('Error loading index.html');
      }
      response.writeHead(200);
      response.end(data);
    });
  }
  else
  {
    fs.readFile(__dirname + request.url, 'utf-8', function (error, data)
    {
      if (error)
      {
        response.writeHead(500);
        return response.end('Error loading ' + request.url);
      }
      response.writeHead(200);
      response.end(data);
    });
  }
}

// Create a Socket.IO instance, passing it our server
var io = require('socket.io')();
io.listen(server);
 
// Add a connect listener
var nsp = io.of('/test');
nsp.on('connection', function(socket)
{
  socket.on('test', function (data)
  {
    console.log(nsp.connected[socket.id] === socket);
    console.log('testdata: ' + data);
    socket.emit('test', 'aloha');
  });
});

index.html
Code:
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="socket.io.js"></script>
    <script>
      var socket = io.connect(location.host + '/test', { forceNew: true });
      socket.on('connect', function ()
      {
        socket.emit('test', 'huhu');
        socket.on('test', function (data)
        {
          console.log('testdata: ' + data);
        });
      });
    </script>
  </head>
  <body>
    
  </body>
</html>

ins selbe verzeichniss die socket.io.js datei legen vom nodejs-modul - ist für socket.io >= 1.0
und getestet
 
Ja laufen tut es jetzt und auch dein Befehl aus dem ersten post gibt mir jetzt nen connection array zurück...
Stimmt, die Doku ist wirklich fürn A****, ich kann daraus nicht erkennen wie sich aus den texten dort nun anwendbare Befehle ergeben. :(

Die handler funktion, für was ist die genau? Ich brauch den Server eigentlich nur um feeds zu verwalten (Facebook als Beispiel, neue Anfragen, Neue Ereignise u.s.w.), d.h. die Funktion dort ganze Webseiten/Dokumente auszugeben etc. brauche ich nicht (Verwirrung *gg*). In meiner eigentlichen Webseite habe ich das ganze bereits integriert und habe es auch testweise mit einem klickevent verbunden, diesen konnte der Server empfangen und via emit auch wieder zurück an den Client sende. Funktioniert also!

Nun würde ich gerne als nächste eine user-validierung vornehmen, dazu verwendet meine Seite bereits memcache um die session dort zuspeichern, so das ich mit node.js dort zugreifen kann.
Meine Tests gleich nach dem connecten eines users dessen cookies auszugeben liefen alle bescheiden, orientiert habe ich mich an zwei Beispiel: erstes
zweites

installiert ist sowohl "cookie-parser" als auch "cookie.js", wobei "co = require("./cookie.js");" wieder zu einem not found führt und darum ich nur "cookie-parser" eingebunden habe.


So ist aktuell die Aufgabe nach dem connecten dort wo ich console.log(cookies); ausgebe eben halt kookies bereit zustellen, über den server handler den man bei createServer() nutzten kann scheint es jedenfalls nicht zu gehen, weil es entweder nicht anständig vor dem connect ausgeführt wird oder im connect nicht richtig angesprochen wurde. Ich wollte ja aber den Inhalt von cookie überschreiben und normaler weise (basis js Arichtektur) müsste in der connectfunktion dann ja der neue Wert von cookie sein ists aber nicht.

Code:
var server = require('http').createServer(handler);
var io = require('socket.io').listen('8080'),
	mysql = require("mysql"),
	squel = require("squel"),
    memcache = require("memcache");
//    co = require("cookie-parser");

// nur zum testen
var cookies = 'test';
function parseCookies()
{
	cookies = 'foo';
}

function handler(req, res){
	cookies = 'foo';
    console.log('run server handler'); // erscheint übrigens auch nicht in der SSH-Console nach einer erfolgten Verbindung
}
 
// Create a Socket.IO instance, passing it our server
var socket = io.listen(server);
socket = socket.of('/root'); // set namespace
socket.on('connection', function(socket){
	console.log(cookies); // gibt test aus nicht foo =(
	
	parseCookies();
	console.log(cookies); // gibt foo aus =)
	
	// console.log( io.of('/root').connected );
    // meine Funktionen, soweit muss man jedoch ers ma kommen :D
});
 
console.log('Juhu Server running');
 
Zuletzt bearbeitet:
Die handler funktion, für was ist die genau?
um http-requests zu handeln, über socket.io fährst du ja das websocket-protokoll, das hat nichts mit http zu tun bis auf den 1. request

Nun würde ich gerne als nächste eine user-validierung vornehmen, dazu verwendet meine Seite bereits memcache um die session dort zuspeichern, so das ich mit node.js dort zugreifen kann.
Meine Tests gleich nach dem connecten eines users dessen cookies auszugeben liefen alle bescheiden, orientiert habe ich mich an zwei Beispiel
du willst also den websocket-server neben einem http-server laufen lassen und dessen session nutzen? dann musst du die cookies auch vom client über websocket mitschicken

installiert ist sowohl "cookie-parser" als auch "cookie.js", wobei "co = require("./cookie.js");" wieder zu einem not found führt und darum ich nur "cookie-parser" eingebunden habe.
dann liegt dein cookie.js nicht im selben verzeichniss wie dein serverscript?

So ist aktuell die Aufgabe nach dem connecten dort wo ich console.log(cookies); ausgebe eben halt kookies bereit zustellen,
was heißt bereitzustellen? du musst vom client die cookies als daten senden

über den server handler den man bei createServer() nutzten kann scheint es jedenfalls nicht zu gehen,
der handler handelt nur http-requestst, die willst du aber glaube ich per php handeln
 
Zuletzt bearbeitet:
Also erst mal zur Klarstellung, socket.io soll nicht eigene cookies verwenden oder sowas, es geht lediglich um dein ersten request hier werden bereits die cookies der Webseite automatisch über den header mitgesendet! Diese Cookies brauche ich, so das ich mir die SESSION-ID holen kann.

Dann wird mittels Memcache auf den Cache zugegriffen und die Session des users ausgelesen (siehe auch meine zwei links^^).
 
Also erst mal zur Klarstellung, socket.io soll nicht eigene cookies verwenden oder sowas, es geht lediglich um dein ersten request hier werden bereits die cookies der Webseite automatisch über den header mitgesendet! Diese Cookies brauche ich, so das ich mir die SESSION-ID holen kann.
da kommst du aber nicht ran, da der 1. request zwar ein http-request ist, aber nur zur verbindungsaufnahme genutz wird. das erledigt aber socket.io für dich.
also musst du die SESSION-ID in deine daten mit einbauen die du per websocket an den websocketserver sendest.

Code:
socket.emit('sessionid', {id:'blablabla'});
 
Zuletzt bearbeitet:
Hmm, aber was sollen dann die ganzen Tutorials zu dem Thema da wird nirgentwo zusätzlich was mitgeliefert, oder ich habe es übersehen, bin mir aber ziemlich sicher das die es eben mit entsprechenden Modulen/Funktionen dort geschafft haben.

Letztendlich erfolgt die uservalidierung dann trotzdem immer client-seitig was mir bissl gegen den Strich geht =(
 
Hmm, aber was sollen dann die ganzen Tutorials zu dem Thema da wird nirgentwo zusätzlich was mitgeliefert, oder ich habe es übersehen, bin mir aber ziemlich sicher das die es eben mit entsprechenden Modulen/Funktionen dort geschafft haben.
dort geht es um 2 http-server (warum auch immer) du hast aber einen http-server und eine websocketverbindung

Letztendlich erfolgt die uservalidierung dann trotzdem immer client-seitig was mir bissl gegen den Strich geht =(
nein, die uservalidierung erfolgt serverseitig, da http aber stateless ist, hilft man sich über die sessionid, die der server an den client schickt und die dieser dann jedesmal wieder an den server sendet. das passiert bei http automatisch durch den browser.
wenn du diese id jetzt auch über das websocket-protokoll nutzen möchtest, musst du sie dort selbst mitschicken. da eine websocket verbindung eine stateful verbindung ist, musst du sie nur 1 mal auslesen(solange du sie nicht änderst), das könntes du im 1. httprequest machen. dann müsstest du das websocket protokoll aber selbst implementieren, oder die implementierung bietet das an. socket.io macht das nicht.
wenn du dich mit php besser auskennst, hier sollte das recht schnell eingebaut sein.

- - - Aktualisiert - - -

dort geht es um 2 http-server (warum auch immer) du hast aber einen http-server und eine websocketverbindung
bzw. schreibt er nur, dass er über node.js eine ws-connection aufbauen will/wollte, bringt aber im beispiel nur den zugriff von http aus
 
Zuletzt bearbeitet:
Huhu,

nun atm mache ich es so:

Client:
Code:
socket.on('connect',function() {
    socket.emit('auth', getCookie('WPOCMS'));
});

Server:
Code:
var server = require('http').createServer();
var io = require('socket.io').listen('8080'),
	mysql = require("mysql"),
	squel = require("squel"),
    memcache = require("memcache"),
	client = require('socket.io-client');

// nur zum testen
var user={};
 
// Create a Socket.IO instance, passing it our server
var socket = io.listen(server);
socket = socket.of('/root'); // set namespace
socket.on('connection', function(socket){
	socket.on('auth', function(sessID)
	{
		var cache = new memcache.Client(11211, "localhost");
		cache.connect();
		
		cache.get("sessions/"+sessID, function(error, result){
			console.log("error : "+error);
			if(typeof(error)==="undefined"){
				//var session = JSON.parse(result);
				console.log(result); // funst und gibt die passenden daten zurück
				// hier wird dann var user geupdate und die zuweisung zwischen sess id und socket id gemacht
			}
		});
	});
});
console.log('Juhu Server running');

Das haut soweit hin das ich mit socket io meine benötigten daten passend zum user erhalte...
Da cookies und die id somit auf user input validiert ist es nicht wirklich serversetigi...
 
Ja aber mein php script validiert und prüft die eingaben bzgl. username & password, der socket-server validiert ja nix mehr er empfängt die SSID und holt sich die session-daten aus memcache die dort hinterlegt werden.
 
Ja aber mein php script validiert und prüft die eingaben bzgl. username & password, der socket-server validiert ja nix mehr er empfängt die SSID und holt sich die session-daten aus memcache die dort hinterlegt werden.
dein php script prüft einmalig die eingaben bzgl. username & password, dann erzeugt er eine sessionid und sendet diese an den client.
beim nächsten request(sprich aufbau einer verbindung zum server) sendet der client diese sessionid an den server und per php prüfst du, ob zu dieser id daten hinterlegt wurden, in der antwort sendet der server die sessionid wieder an den client
beim nächsten request(sprich aufbau einer verbindung zum server) sendet der client ...
jetzt willst du vom client eine websocketverbindung aufbauen, und sendest diese sessionid an den websocketserver, per js prüfst du, ob zu dieser id daten hinterlegt wurden, jetzt steht die bidirektionale verbindung zw. server und client, das heißt, ab jetzt kannst du bei websockets auf das senden der sessionid verzichten und dir eine referenz auf die daten halten
also nichts anderes als bei http, nur die verbindung bleibt bestehen
 
Auch wieder war :) Naja sobald ich da jetzt mein user-listing fertig gestellt habe werde ich noch mal auf socket-io zurückkommen wie des so mit den emit zu nem definierten client geht...
Habe da schon gesehen das socket ne eigene userid führt die bei jedem connect ändert und man diese id nehmen kann um dem user und nur diesem (also nicht allen) etwas senden kann.

Jedoch funktionierten die Methoden die ich gefunden hatte irgend wie nicht wirklich... =(
 
Zurück
Oben