Netzwerk-Chat ohne Server!
Übersicht

FreeFredBetreff: Netzwerk-Chat ohne Server! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi Leute,
ich versuche gerade ein möglichst kleines Programm zu schreiben, dass auf zwei Rechnern in identischer Form ausgeführt werden kann. Damit sollen Text-Eingaben auf andere Rechner übertragen werden, ohne dass einer der Rechner ausdrücklich Server bzw. Host ist. Das Programm soll gleichzeitig Server- und Client-Funktionalität haben. Anders gesagt: Es soll eine dezentrale P2P-Kommunikation hergestellt werden. Ist das so überhaupt möglich? Was sagt ihr? Mein Code sollte erst einmal für zwei Rechner sein. Dabei müssen IP und Ports auf den Rechnern noch manuell angepasst werden. Bisher funzt es aber noch nicht: Code: [AUSKLAPPEN] Print "Servant"
Print "" ServerIP = CodiereIP("127.0.0.1") ServerPort = 2000 ClientPort = 2001 EmpfangsStream = CreateUDPStream(ServerPort) SendeStream = CreateUDPStream(ClientPort) Print "Mein EmpfangsPort: " + UDPStreamPort(EmpfangsStream) Print "Mein SendePort: " + UDPStreamPort(SendeStream) Print "" While True IP = RecvUDPMsg(EmpfangsStream) If IP Then Print "Nachricht von " + DottedIP$(IP) + ":" Print "> " + ReadLine$(EmpfangsStream) Print "" WriteLine Stream, "Nachricht erhalten" SendUDPMsg Stream, IP, UDPMsgPort(SendeStream) EndIf If KeyHit(49) Then ;Taste n für Nachricht Message$ = Input$("Nachricht: ") Print "" If Message$ = "quit" Then WriteLine SendeStream, "Client wird beendet..." SendUDPMsg SendeStream, ServerIP, ServerPort Exit Else WriteLine SendeStream, Message$ SendUDPMsg SendeStream, ServerIP, ServerPort EndIf EndIf Wend CloseUDPStream SendeStream CloseUDPStream EmpfangsStream End Function CodiereIP(IP$) CountHostIPs(IP$) Return HostIP(1) End Function Wenn ich dieses Programm auf beiden Rechnern so anpasse, dass auf einem nur empfangen wird und auf dem anderen nur gesendet, dann funktioniert es! Um dem vorzubeugen: Ich weiß, dass es auch mit einem Stream machbar wäre ![]() Der Code soll möglichst so einfach bleiben wie er ist - ohne Schnickschnack und so. Denn ich muss das ganze meinen kleinen Schülern beibringen und die sind erst 10-12 Jahre alt (aber schon weit genug für Netzwerk-Programmierung). Wer kann mir helfen? |
||
- Zuletzt bearbeitet von FreeFred am Do, Jan 05, 2006 19:54, insgesamt einmal bearbeitet
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ich habe des auch mal gemacht aber mit der DirectPlay anweisung, und mitt bb+ also iun gui form, das prog war sehr klein und naja auch cool
es geht aber auch mit tcp, SERVER+CLIENT mischung, das geht dan sogar mit internet, wenn man von jedem die derzeitige ip weiss, oder man holt sich ne domain, dann braucht man keine ip mehr |
||
FreeFred |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, es sollte aber schon alles "zu Fuß" programmiert werden, sonst lernen die Kleinen nicht so viel daraus... | ||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
Du kannst auch mit nur einem Stream Empfangen und Senden, das macht das ganze (finde ich) auch einfacher. Eine IP kann auch negativ sein als Integer dargestellt. Ich weiss nicht mehr genau wie es bei BB gehandhabt wird mit dem True und False. Aber um sicher zu gehen könntest du ja die IP auf <> 0 testen. Denn wenn negativ = False bedeutet, wird deine If-Bedingung nicht erfüllt. Sonst scheint aber alles in Ordnung zu sein ![]() Edit: Sorry, hab deine Aussage wegen einem Stream erst nachher gesehen ![]() |
||
FreeFred |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So, hab das Proggi erstmal so geändert, dass es auch auf einem Rechner läuft. Dann viel mir noch ein Fehler auf: Hab zweimal "Stream" benutzt, obwohl ich nur "Empfangsstream" und "Sendestream" definiert habe ![]() In dieser Version läuft es nun (siehe unten). [einfach in zwei Dateien speichern und bei der einen die Ports auf 2002, 2003 und 2000 setzen - fertig] An dem <> 0 lag es übrigens nicht. Ich denke auch negative Zahlen sind true, nur Null ist false... Habs aber zwecks besserem Verständnis mal abgeändert ![]() Wer kann mir nun daraus eine Version mit einem Stream machen (mit möglichst geringer Veränderung)? Code: [AUSKLAPPEN] Print "Servant"
Print "" EntfernteIP = CodiereIP("127.0.0.1") MeinEmpfangsPort = 2000 MeinSendePort = 2001 EntfernterEmpfangsPort = 2002 EmpfangsStream = CreateUDPStream(MeinEmpfangsPort) SendeStream = CreateUDPStream(MeinSendePort) Print "Mein EmpfangsPort: " + UDPStreamPort(EmpfangsStream) Print "Mein SendePort: " + UDPStreamPort(SendeStream) Print "" While True IP = RecvUDPMsg(EmpfangsStream) If IP <> 0 Then Print "Nachricht von " + DottedIP$(IP) + ":" Print "> " + ReadLine$(EmpfangsStream) Print "" WriteLine SendeStream, "Nachricht erhalten" SendUDPMsg SendeStream, IP, UDPMsgPort(SendeStream) EndIf If KeyHit(49) Then ;Taste n fuer Nachricht Message$ = Input$("Nachricht: ") Print "" If Message$ = "quit" Then WriteLine SendeStream, "Ich bin weg..." SendUDPMsg SendeStream, EntfernteIP, EntfernterEmpfangsPort Exit Else WriteLine SendeStream, Message$ SendUDPMsg SendeStream, EntfernteIP, EntfernterEmpfangsPort EndIf EndIf If KeyHit(1) Then Exit EndIf Wend CloseUDPStream SendeStream CloseUDPStream EmpfangsStream End Function CodiereIP(IP$) CountHostIPs(IP$) Return HostIP(1) End Function |
||
FreeFred |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hab das ganze noch weiter vereinfacht und gekürzt. Es gibt nur noch zwei Ports, die eingestellt werden müssen.
Auch das Versenden der Empfangsbestätigung funktioniert jetzt. Fehlt nur noch eine Version mit nur einem Stream... Code: [AUSKLAPPEN] Print "Servant"
Print "" EntfernteIP = CodiereIP("127.0.0.1") MeinEmpfangsPort = 2000 EntfernterEmpfangsPort = 2001 EmpfangsStream = CreateUDPStream(MeinEmpfangsPort) SendeStream = CreateUDPStream() While True IP = RecvUDPMsg(EmpfangsStream) If IP <> 0 Then Nachricht$ = ReadLine$(EmpfangsStream) Print "Nachricht von " + DottedIP$(IP) + ":" Print "> " + Nachricht$ Print "" If Nachricht$ <> "Nachricht erhalten" WriteLine SendeStream, "Nachricht erhalten" SendUDPMsg SendeStream, IP, EntfernterEmpfangsPort EndIf EndIf If KeyHit(49) Then ;Taste n fuer Nachricht Message$ = Input$("Nachricht: ") Print "" WriteLine SendeStream, Message$ SendUDPMsg SendeStream, EntfernteIP, EntfernterEmpfangsPort EndIf If KeyHit(1) Then Exit EndIf Wend CloseUDPStream SendeStream CloseUDPStream EmpfangsStream End Function CodiereIP(IP$) CountHostIPs(IP$) Return HostIP(1) End Function |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nennt sich das nicht BroadCast ?
Eine Nachricht an alle anderen zu schicken ? Das sollte mit UDP gehen . Die jeweiligen Client picken sich dann raus was sie brauchen . |
||
FreeFred |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein das ist was anderes. Wenn mein Servant nur einen Stream hat, gibt es im System ja doch zwei Streams, wenn der Servant zweimal gestartet wird - eben für jedes Programm einen (statt zwei).
Habs übrigens gerade geschafft. In der zuletzt geposteten Version musste ich nur alle "Sendestream" und "Empfangsstream" zu "Stream" machen - fertig. Na wenn das nicht ein gutes Beispiel für einen 1-Stream-Chat ist... Habs noch weiter gekürzt - soll halt ein Beispiel für die minimalste P2P-Kommunikation werden... Code: [AUSKLAPPEN] EntfernteIP = CodiereIP("127.0.0.1")
MeinEmpfangsPort = 2000 EntfernterEmpfangsPort = 2001 Stream = CreateUDPStream(MeinEmpfangsPort) While True IP = RecvUDPMsg(Stream) If IP <> 0 Then Nachricht$ = ReadLine$(Stream) Print "Nachricht von " + DottedIP$(IP) + ":" Print "> " + Nachricht$ Print "" EndIf If KeyHit(49) Then ;Taste n fuer Nachricht Nachricht$ = Input$("Nachricht: ") Print "" WriteLine Stream, Nachricht$ SendUDPMsg Stream, EntfernteIP, EntfernterEmpfangsPort EndIf If KeyHit(1) Then Exit EndIf Wend CloseUDPStream Stream End Function CodiereIP(IP$) CountHostIPs(IP$) Return HostIP(1) End Function ![]() ![]() ![]() |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Solange du es nicht lokal testest, würde sogar ein Port ausreichen, so dass alle Clients den selben Port benutzen ![]() |
||
FreeFred |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Stimmt, ist mir auch schon aufgefallen. Hatte es ja auch zum lokal testen so umgebaut.
Danke für eure Hilfe! |
||
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Apropos Broadcast:
Leider geht das nicht mit BB3D. Die Broadcast-Adresse 255.255.255.255, welche ja eigentlich das geamste Netzwerk erreichen sollte, kommt leider nicht an. Sehr schade übrigens. Hat irgendwer ne Ahnung ob Broadcast mit BBMax funktioniert? |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die Broadcasts werden irgendwie auch durch die Subnetmask begrenzt. Bei 255.255.255.0 kann nur ein Broadcast auf die letzte Ziffer erfolgen z.B. 192.168.0.255. Bei 255.255.0.0 müsste es eigentlich auch mit den letzten 2 Ziffern gehen 192.168.255.255). | ||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group