Laden...

P2P-Chat System

Erstellt von tt556789900 vor 15 Jahren Letzter Beitrag vor 13 Jahren 6.643 Views
T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 15 Jahren
P2P-Chat System

Salli @ all,

ich bin gerade mit einem kleinen Projekt fertig geworden und wuerd nun gern wissen, ob mein Loesungsansatz logisch umgesetzt wurde. Ich freu mich ueber Verbesserungsvorschlaege und Kritik, da ich mich so weiterbilden kann =)

Also Ziel war es, ein P2P Chat System zu realisieren. Bei der Umsetzung bin ich auf einige Probleme gestossen wie zB Endlos-Echo Nachrichten, unbemerkte Time-Outs von Clienten und noch paar andere.

Zu dem ganzen habe ich mir das folgende Konzept ausgedacht:

Die 3 verschiedenen Nachrichten-Frames:

Die neu erstellte Nachricht:
Eine MessageID, die nicht in dem temporaeren MessagID-Array vorhanden ist, wird erstellt und der locale eingegebene Username + Nachricht wird hinzugefuegt.
Das ganze schaut dann so aus:

MessageID;SeperateByte;Username;SeperateByte;Message;Endbyte

Die Alive-Nachricht;
Sie besteht aus dem Alivebyte und dem Stopbyte, sie wird alle 2 Sekunden an alle verbundenen Server geschickt.

Alivebyte;Endbyte

Die Disconnect-Nachricht;
Sie besteht aus dem Disconnectbyte und dem Stopbyte. Sie wird von dem Server/Client versendet, der sich abmeldet.

Disconnectbyte;Endbyte

Die speziellen Bytes:
MessageID = Eine Randombasierende Zahl von 10000000 bis 99999999.
endbyte = 255
alivebyte = 254
Disconnectbyte = 253
seperatebyte = 252

Die MessageID ist dazu da, den Echo-Effekt auszuschliessen, der in einem p2p Netzwerk leicht passieren kann. Dazu auch die alive Nachricht, sie dient dazu, einen offline Server/Clienten zu erkennen, damit sich der Client versuchen kann, sich neu zu verbinden oder der Server den Socket wieder frei gibt.

Ich hab das ganze zum einbinden auch ziemlich vereinfacht, was es praktisch zu einem 5 Zeiler gerade mal macht ^^:

Klasse einbinden;


p2psocket _p2psocket = new p2psocket(username, port);

Events einbinden:


_p2psocket.ReplyEvent += new MyHandler(ReplyEvent);
_p2psocket.InfoEvent += new MyHandler(InfoEvent);
_p2psocket.ErrorEvent += new MyHandler(ErrorEvent);

Listener starten:


_p2psocket.Listen();

Neue Verbindungen aufbauen:


_p2psocket.newConnect("127.0.0.1", 4711);

Nachricht schreiben:


_p2psocket.Send("text";);

P2P beenden:


_p2psocket.Dispose();
while (!_p2psocket.IsDisposed()) { }
_p2psocket = null;
49.485 Beiträge seit 2005
vor 15 Jahren

Nur so als Warnung, wegen der Form des Beitrags: Natürlich kann man in "Projekte" Vorschläge zur Verbesserung machen, aber inbesondere längere fachliche Diskussionen sollten in "Projekte" unterbleiben. Für fachliche Diskussionen gibt es geeignetere Unterforen. Unter "Projekte" geht es darum, die eigene Arbeit anderen ohne Erwartung einer Gegenleistung zur Verfügung zu stellen.

T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 15 Jahren

Das ist mir schon klar, durch die Benutzung meiner Klasse von anderen kann jenes durch Verbesserungen und Kritik ja schliesslich wachsen. Das kann ja auch ueber pn geschehen und muss nicht direkt im thread diskutiert werden.

T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 15 Jahren

Update:

-Oberfläche
-Whisperfunktion
-Informationsfunktionen(Peer connect,disconnect,namechange)
-ansprechen per Username
-Umänderung der Nachrichtenframe; trennung der einzelnen Elemente nun durch länge nicht mehr durch das seperate Byte

Ich habe die Klasse p2psocket.cs mit folgenden zusätzlichen Funktionen ausgestattet:

Klasse einbinden:

_p2psocket = new p2psocket(Username,Port);

Die verschiedenen Events:
(Network Event wird ausgegeben, wenn der PC nicht am Netzwerk angeschlossen ist)

_p2psocket.InfoEvent +=new p2psocket.InfoHandler(p2pInfoEvent);
_p2psocket.ErrorEvent +=new p2psocket.ErrorHanlder(p2pErrorEvent);
_p2psocket.MessageEvent +=new p2psocket.MessageHandler(p2pMessageEvent);
_p2psocket.NamechangeEvent +=new p2psocket.NamechangeHandler(p2pNamechangeEvent);
_p2psocket.DisconnectEvent +=new p2psocket.DisconnectHandler(p2pDisconnectEvent);
_p2psocket.ConnectEvent +=new p2psocket.ConnectHandler(p2pConnectEvent);
_p2psocket.NetworkEvent +=new p2psocket.NetworkHandler(p2pNetworkEvent);

Listener starten:

_p2psocket.Listen();

Listener nach status abfragen:

_p2psocket.IsListening();

Listener beenden:

 _p2psocket.QuitListen();

Neue Verbindung aufbauen:

_p2psocket.newConnect(Address, Port);

Global Chat:

_p2psocket.Send(Message);

Whisper Chat:

_p2psocket.Send(Message, User);

Name verändern:

_p2psocket.Username = newUser;

p2psocket beenden:

_p2psocket.Dispose();

Überprüfen ob p2psocket beendet ist:

_p2psocket.IsDisposed();
T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 15 Jahren

Bugfix:

  • Kompletteinbindung von OfficePicker.dll: Da es Probleme mit der OfficePicker.dll gab, habe ich diese nun beigelegt.
W
196 Beiträge seit 2007
vor 13 Jahren

Hey das ist echt ein tolles Projekt! Funktioniert sehr gut. Du solltest du den Source auch Windows 7 kompatibel gestalten, da Dns.GetHostEntry immer eine Exception auslöst, da auch IPv6 Adressen geladen werden. Ich selbst würde auch die Klassen p2psocket und Protocol Chat unabhängig entwickeln, damit man sie für alle möglichen Vorstellungen nutzen könnte.

Lg wizer