JavaScript websocket - 1:1 Chat möglich?

Gamer20

Lt. Junior Grade
Registriert
Dez. 2005
Beiträge
509
Hi!

Kann man mit Websockets auch einen 1:1 Chat realisieren?

Der Gedanke ist, einen Chat zu schreiben, indem alle Nutzer gleichzeitig online sein können, ABER auch die Möglichkeit bekommen sollen, mit einer bestimmten Person privat zu chatten.

Im Moment hänge ich an der Idee, den globalen Chat per Websockets zu machen und die privat Chats per Ajax und long Polling.

(kann man auch open polling realisieren und ja wie?)

als JS Framwork nehme ich JQuery.

mfg
 
WebSockets dienen der kommunikation zwischen Clients und einem Server. Für P2P Kommunikation solltest du dir mal WebRTC ansehen.
 
Ich glaube, er fragte lediglich, ob man mit Websockets auch einen "privaten" Chat zwischen zwei Personen realisieren kann, unabhängig von P2P oder Client/Server - Also kein Broadcasting an alle Clients, wie man es in Tutorials immer sieht.

Ja, kannst du natürlich, warum auch nicht? Du musst ein entsprechendes Routing auf Serverseite einbauen und schauen, dass die Nachrichten nur dort ankommen, wo sie hinsollen.
 
Zuletzt bearbeitet:
ich meine das ich 1 großen fenster habe (500x500 pixel) das ist der globale chat. wenn ein nutzer rechts in die nutzerliste klickt, soll sich ein kleines fenster öffnen und der nutzer kann dann mit der gewählten person chatten. nebenher läuft der globale chat (im großen fenster) nebenher.

also würde das bedeuten, das ich 2 chatvarianten gleichzeitig laufen lassen würde.

desweiteren stelle ich mir die frage, wo die grenze bei websockets liegt (menge der nutzer im chat) ich habe eine server gesehen mit 16 GB ram und einem 4 kern intel cpu.

ich würde eh die menge der leute im chat begrenzen. wenn limit erreicht ist, kann keiner mehr in den chat rein.

ich habe im moment denkprobleme mit dem websocketsystem. denn die server.js auf dem server ist ja für alle gleichzeitig da (nicht wie bei php, das pro person ein php script aufgerufen wird und für die person das ergebnis zurück gibt).

schade das websockets noch net so stark implementiert sind, sonst gebe es genug lektüre wie bei php oder jquery.
 
Gamer20 schrieb:
desweiteren stelle ich mir die frage, wo die grenze bei websockets liegt (menge der nutzer im chat) ich habe eine server gesehen mit 16 GB ram und einem 4 kern intel cpu.

Sowas ist Pauschal immer schwer zu sagen. Bei einen Chat wird die Bandbreite eher weniger zum Flaschenhals, bleibt noch die Hardware deines Servers, und hier vor allem der RAM. Mit den von dir erwähnten 16 GB wirst du aber schon im fünfstelligen Bereich landen was die Anzahl simultaner WebSocket-Verbindungen angeht.. vielleicht auch mehr, weniger aber kaum.


Gamer20 schrieb:
ich habe im moment denkprobleme mit dem websocketsystem. denn die server.js auf dem server ist ja für alle gleichzeitig da (nicht wie bei php, das pro person ein php script aufgerufen wird und für die person das ergebnis zurück gibt).

Das macht es doch eher einfacher als komplizierter. Du bekommst von User X eine neue Nachricht rein. Dann musst du (beispielsweise anhand eigener Metadaten in der Nachricht) entscheiden, ob du einen "Broadcast" in einen öffentlichen Chatroom ausführst, oder aber lediglich ein bestimmtes Ziel-Socket (privater Chat) bedienst. Je nachdem, was für Technologien du einsetzt, gibt es da sicherlich Abstraktionen. Wie so ein minimalstisches Chat-Protokoll aussehen könnte siehst du hier.
 
Zuletzt bearbeitet:
ja klar ist es einfacher, wenn die nachricht an alle geht, aber dafür umso schwerer es nur an eine bestimmte person zu senden (also für mich jetzt, was meine denkweise anbelangt).

für mich ist das noch neuland. ich nutze node.js + socket.io.

das script zum senden der nachricht an ALLE Clients:

Code:
io.sockets.on('connection', function (socket)
{
console.log('Verbindung hergestellt');
socket.emit('InitialData', { Message: 'viel Spass' });

socket.on('sendMessage', function (data)
{
socket.broadcast.emit('messageRecieve', data);
});

});

wenn jetzt jemand (z.b. nutzerID 2 an nutzerID 186) privat chatten will, geht das auch über diese server.js. aber dafür müßte ich wohl dann eine extra socket.on funktion schreiben???

wobei man ja dann wissen müßte, an wen die nachricht gehen soll. soweit ich gelesen habe, wird auf dem server von dem websocket aus, jeder neue client eine ID erhalten (aber nicht meine ID von meiner DB sondern eine selbst erstellte ID vom Server).

ok mit metataden meinst bestimmt, das ich per json format an den server die IP senden lasse (und eben die nachricht, timestamp und und und)??

wie sende ich dann eine nachricht an die 1 bestimmte IP?

eieiei das ist ja ne schwere angelegenheit!

hmm ich versuch mich mal in deinen link rein zu lesen.

im moment habe ich ja meine eigenen scripte, aber in deinem beispiel gibts ja noch das zeug mit dem login und logout. da muß man das nicht per ajax machen (zeitabständen in der DB den timestamp prüfen und dann die onlineliste der mitglieder aktualisieren).

ich hoffe ich komme damit zurecht, mal schauen. dein beispiel in deinem link (das basiert auf JAVA "gradle-wrapper.jar"?), wollt ich vermeiden, da wenige leute java installiert haben.

aber jetzt gehe ich erstmal ins bett :D

mfg
 
Zuletzt bearbeitet:
Mein Link war nur ein Beispiel für den möglichen Aufbau einer Nachricht samt Metadaten, alles andere dort kannst du ignorieren.

So wie du mit socket.broadcast.emit() einen Broadcast sendest, kannst du mit io.sockets.socket(socketId).emit() (oder so ähnlich, habe noch nie mit socket.io gearbeitet, wird wohl etwas anders aussehen) eine Nachricht an einen bestimmten Teilnehmer senden. Dann musst du serverseitig etwas Logik schreiben, die prüft, für wen die Message bestimmt ist und entsprechendes Routing betreibt.

edit: schau mal hier http://stackoverflow.com/questions/...client-with-socket-io-and-empty-message-queue
 
Zuletzt bearbeitet:
hi!

wenn ich per node ap.jsp den server starte, kommt im browser immer folgender fehler:

Cannot GET /test/index.html

in firebug:

"NetworkError: 404 Not Found - http://localhost:8012/test/index.html"

aber das ist der korrekte pfad:

c:\programme\xampp\htdocs\test\index.html

ich sitze schon den ganzen tag davor und weiß nicht wo das problem liegt.

express
socket.io
node.js

ist im "test" ordner installiert und der server bzw. die console läuft.

jemand eine idee wo das problem liegt?

hier der code:

app.js

Code:
var express = require('express'),
	app = express(),
	server = require('http').createServer(app),
	io = require('socket.io').listen(server);
	
server.listen(8012);

app.get('/', function(req, res){
	res.sendfile(__dirname + '/index.html');
});

io.sockets.on('connection', function(socket){
	socket.on('send message', function(data){
		io.sockets.emit('new message', data);
	});
});

index.html

Code:
<html>
<head>
	<title>Chat with socket.io and node.js</title>
	<style>
		#chat{
			height:500px;
		}
	</style>
</head>
<body>
	<div id="chat"></div>
	<form id="send-message">
		<input size="35" id="message"></input>
		<input type="submit"></input>
	</form>
	
	<script src="http://code.jquery.com/jquery-latest.min.js"></script>
	<script src="/socket.io/socket.io.js"></script>
	<script>
		jQuery(function($){
			var socket = io.connect();
			var $messageForm = $('#send-message');
			var $messageBox = $('#message');
			var $chat = $('#chat');
			
			$messageForm.submit(function(e){
				e.preventDefault();
				socket.emit('send message', $messageBox.val());
				$messageBox.val('');
			});
			
			socket.on('new message', function(data){
				$chat.append(data + "<br/>");
			});
		});
	</script>
</body>
</html>
 
Zuletzt bearbeitet:
Routing
Code:
app.get('/', function(req, res) {
   res.sendfile('./test/index.html');
});
Weitere statische Files á CSS, JS ... die von der HTML aus geladen werden sollen, müssen über eine static middleware zugeordnet werden.
Code:
app.use(express.static(path.join(__dirname, 'test')));
 
Zuletzt bearbeitet:
so ich habe es anders gemacht und jetzt klappt es erstmal. hab zwar ein neues problem, aber mal sehen ob ich das hin bekomme (der will mir den nicknamen nicht mit ausgeben -> "Barbel": na wie ist das wetter heute").

weder der fehler liegt in der übergabe an den server oder die auswertung in der server.js ist fehlerfaft. zurück senden tut er es ja (hatte mal einen fixen namen angegeben).

erstmal danke für eure infos und mühe
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben