Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich versuche gerade einen Websocket-Server aufzusetzen und ne Art kleinen Chat draus zu machen. Der Server selbst läuft mittlerweile, doch wenn ich mich mit zwei verschiedenen Browsern anmelde, sind die Browser nicht wie erwartet am selben Server angemeldet, bzw bekommt zumindest der eine Browser nicht die erwartete Nachricht vom anderen Browser. Ich finde meinen Fehler schon den ganzen Tag nicht, vielleicht hat ja jemand Lust mal drüberzuschauen und mir ggfs etwas Zeit zu sparen:

WSS.php: (Die Datei, die als Deamonscript per Shell gestartet wurde)

<?php
require_once ($_SERVER['DOCUMENT_ROOT'] ."/Websockets/so/abstractwebsocketserver.php");

class WebSocketServer extends AbstractWebSocketServer {

	
	protected function process($user, $message) {
		$this->sendToAllConnectedUsers($message);
	}

	protected function connected($user) {
		// Do nothing: This is just an echo server, there's no need to track the user.
		// However, if we did care about the users, we would probably have a cookie to
		// parse at this step, would be looking them up in permanent storage, etc.
	}

	protected function closed($user) {
		// Do nothing: This is where cleanup would go, in case the user had any sort of
		// open files or other objects associated with them. This runs after the socket
		// has been closed, so there is no need to clean up the socket itself here.
	}

}

$server = new WebSocketServer("127.0.0.1", 11111);

try {
	$server->run();
}
catch (\Exception $e) {
	$server->stdout($e->getMessage());
}

Ich denke, hier in der connected-Methode wird der Hinweis für mich sein - doch für alle Chatversionen, die ich finde, wurden keine Cookies verwendet - ich dachte, hier sollte vielleicht der user in den users-Array eingefügt werden, doch das geschieht schon in der connect-Methode der abstrakten Klasse.

Den AbstractWebSocketServer habe ich von ghedipunk übernommen, zu AbstractWebSocketServer umbenannt und um die folgende Funktion erweitert:

protected function sendToAllConnectedUsers($msg) {
	foreach($this->users as $user) {
		send($user, $msg);
	}
}

Die client.html:

<html>
<head>
<title>WebSocket</title>
<style type="text/css">
html, body {
	font: normal 0.9em arial, helvetica;
}

#log {
	width: 600px;
	height: 300px;
	border: 1px solid #7F9DB9;
	overflow: auto;
}

#msg {
	width: 400px;
}
</style>
<script src="client.js" type="text/javascript"></script>
</head>
<body onload="init()">
	<h3>WebSocket v2.00</h3>
	<div id="log"></div>
	<input id="username" type="text" />
	<input id="msg" type="text" onkeypress="onkey(event)" />
	<button onclick="send()">Send</button>
	<button onclick="quit()">Quit</button>
	<button onclick="reconnect()">Reconnect</button>
</body>
</html>

und die client.js:

var socket;

function init() {
	var host = "ws://127.0.0.1:11111/WSS.php"; 
	try {
		socket = new WebSocket(host);
		log('WebSocket - status ' + socket.readyState);
		socket.onopen = function(msg) {
			log("Welcome - status " + this.readyState);
		};
		socket.onmessage = function(msg) {
			log("Empfangen: " + msg.data);
		};
		socket.onclose = function(msg) {
			log("Disconnected - status " + this.readyState);
		};
	} catch (ex) {
		log(ex);
	}
	$("msg").focus();
}
function send() {
	var txt, msg, name;
	name = $("username").value;
	txt = $("msg");
	msg = txt.value;
	
	if (!msg) {
		alert("Gib ne Nachricht ein.");
		return;
	}
	txt.value = "";
	txt.focus();
	try {
		socket.send(name + ": " +msg);
		log('Gesendet: ' + msg);
	} catch (ex) {
		log(ex);
	}
}
function quit() {
	if (socket != null) {
		log("Goodbye!");
		socket.close();
		socket = null;
	}
}
function reconnect() {
	quit();
	init();
}
// Utilities
function $(id) {
	return document.getElementById(id);
}
function log(msg) {
	$("log").innerHTML += "<br>" + msg;
}
function onkey(event) {
	if (event.keyCode == 13) {
		send();
	}
}

Wenn ich mich jetzt mit zwei verschiedenen Browsern auf die index.php begebe (die nur die client.html includet), sendet (und empfängt) der WebsocketServer nur im eigenen Browser, nicht im anderen. Was habe ich übersehen? Ich wälz das schon nen ganzen Moment und alle google-Suche führt nicht zum gewünschten Ergebnis. Es wird wohl was ganz dummes sein müssen, also seid bitte gnädig :) 

Danke im Voraus und lieben Gruß,

Martin

Geschrieben

Oha.. das kann weg. Der Server war überhaupt nicht am laufen, da es ne Fehlermeldung gab, weil die $_SERVER-Variable nicht gesetzt war, weils halt als Daemon gestartet wurde.. was ich also gesehen hab, war, wie JavaScript Spass mit der HTML hatte und den Server "simulierte". Wie ich die Fehlermeldung übersehen konnte, ist mir ein Rätsel. 

Ich entschuldige mich fürs Vergeuden eurer Zeit und bitte einen Admin darum, das möglichst schnell zu löschen, da ich nicht denke, dass dieser Faux-Pas irgendwem anders helfen kann. :D

Vielen Dank trotzdem :)

Grüße, Martin

 

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...