Netzwerk-Chat ohne Server!

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

FreeFred

Betreff: Netzwerk-Chat ohne Server!

BeitragDo, Jan 05, 2006 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

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

BeitragDo, Jan 05, 2006 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 05, 2006 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, es sollte aber schon alles "zu Fuß" programmiert werden, sonst lernen die Kleinen nicht so viel daraus...

Jolinah

BeitragDo, Jan 05, 2006 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Edit:
Sorry, hab deine Aussage wegen einem Stream erst nachher gesehen Wink
 

FreeFred

BeitragDo, Jan 05, 2006 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes

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 Wink


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

BeitragDo, Jan 05, 2006 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 05, 2006 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 05, 2006 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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


Very Happy Very Happy Very Happy - langsam gefällts mir.

Jolinah

BeitragDo, Jan 05, 2006 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Solange du es nicht lokal testest, würde sogar ein Port ausreichen, so dass alle Clients den selben Port benutzen Wink
 

FreeFred

BeitragFr, Jan 06, 2006 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, ist mir auch schon aufgefallen. Hatte es ja auch zum lokal testen so umgebaut.

Danke für eure Hilfe!
 

Klaas

BeitragFr, Jan 06, 2006 12:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 06, 2006 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group