Seite 1 von 2

Client/Server in einem Programm, wie geht das mit den Event

Verfasst: 06.02.2012 15:56
von funkheld

Code: Alles auswählen

Verbindung = OpenNetworkConnection(ServerName$, Port )
Ergebnis = NetworkClientEvent(Verbindung) 
Ergebnis = NetworkServerEvent() 
Ergebnis = ReceiveNetworkData(Verbindung, *DatenPuffer, DatenPufferLänge)
Ergebnis = SendNetworkData(Verbindung, *SpeicherPuffer, Länge)
CloseNetworkConnection(Verbindung)
Ich schaff es nicht einen Client und Server zusammenzufassen über die Event.
welches sind nun Clientbefehle und welches Serverbefehle?
Ich möchte eine Verbindung zum Server aufnehmen, dann wieder Daten vom Server empfangen und wieder antworten und dann wieder Daten empfangen.

Wer kann aus den Befehlen oben mal so etwas herstellen?
Ich finde immer nur Server und Client getrennt-

Danke.

Gruss

Edit by NicTheQuick: Code-Tags der Lesbarkeit halber hinzugefügt und Thema ins Anfängerforum verschoben

Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 06.02.2012 16:24
von ts-soft
funkheld hat geschrieben:Verbindung = OpenNetworkConnection(ServerName$, Port )
Ergebnis = NetworkClientEvent(Verbindung)
Ergebnis = NetworkServerEvent()
Ergebnis = ReceiveNetworkData(Verbindung, *DatenPuffer, DatenPufferLänge)
Ergebnis = SendNetworkData(Verbindung, *SpeicherPuffer, Länge)
CloseNetworkConnection(Verbindung)

Ich schaff es nicht einen Client und Server zusammenzufassen über die Event.
welches sind nun Clientbefehle und welches Serverbefehle?
Bis auf NetworkServerEvent() sind die Funktionen für den Clienten.
Was willst Du jetzt zusammenfassen? Für zusi brauchst Du nur einen Clienten,
der Server sollte da ja mitgeliefert sein.

Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 06.02.2012 17:18
von funkheld
Hmm.., danke das du fragst !

FP= Fahrpult, wird als Client benutzt um die kommunikation zum SVR herzustellen, FP empfängt die Daten vom Server, der ja Kontakt hat mit Zusi2 und FP sendet auch als erstes ein Protokoll zum SVR.
Ein Client (FP) der sendet und empfängt, bekomme ich mit den Event nicht auf die Reihe.

SRV= Server wird mitgeliefert und ist dann für den Empfand vom Zusi2 zuständig und den Empfang vom FP bzw Daten senden zum FP.

Es muss, wie unten im Protokoll ersichtlich ist , erst mal ein Gespräch zwischen Client (FP) und Server (SRV) stattfinden. Dann werden die Daten auch vom Clienten (FP) empfangen.

Daten für das Info-Fenster, (INFO) vergess erstmal.

Ganz unten erkennt man auch, wie der SVR die Daten von Zusi2 abholt und weiterschickt an den Clienten (FP).

Danke.

Gruss
In diesem Beispiel gehen wir von zwei gedachten Anwendungen aus, die verschiedene Daten benötigen. Das Beispiel zeigt die komplette Kommunikation bis zum Empfangen der ersten Daten. Dies soll den Ablauf des Protokolls näher verdeutlichen.

Die gedachten Anwendungen sind ein Fahrpult (FP) und ein zusätzliches Infofenster (INFO) sowie der Server (SRV). Das Fahrpult benötigt im Beispiel die Geschwindigkeit und den Druck der Hauptlufteitung. Das Infofenster benötigt ebenfalls die Geschwindigkeit und die aktuelle Streckenkilometrierung. Der Einfachheit halber verwende ich die IDs 01 (Geschwindigkeit), 02 (HLL-Druck) und 03 (Kilometrierung). Die Paketlänge ergibt sich von selbst und wird im Beispiel ebenfalls weggelassen.

Anwendung Daten Beschreibung
FP > SRV 00 01 01 02 08 46 61 68 72 70 75 6C 74 HELLO-Befehl
Protokoll-Version "1"
Client-Typ "Fahrpult"
String "Fahrpult" mit führender Längenangabe (8 Bytes)

SRV > FP 00 02 00 ACK_HELLO-Befehl
Befehl akzeptiert

FP > SRV 00 03 00 0A 01 02 NEEDED_DATA-Befehl
Befehlsvorrat 00 0A
IDs 01 und 02

SRV > FP 00 04 00 ACK_NEEDED_DATA-Befehl
Befehl akzeptiert

FP > SRV 00 03 00 00 NEEDED_DATA-Befehl
Befehlsvorrat 00 00: Letzter Befehl

SRV > FP 00 04 00 ACK_NEEDED_DATA-Befehl
Befehl akzeptiert

INFO > SRV 00 01 01 02 04 49 6E 66 6F HELLO-Befehl
Protokoll-Version "1"
Client-Typ "Fahrpult"
String "Info" mit führender Längenangabe (4 Bytes)

SRV > INFO 00 02 00 ACK_HELLO-Befehl
Befehl akzeptiert

INFO > SRV 00 03 00 0A 01 03 NEEDED_DATA-Befehl
Befehlsvorrat 00 0A
IDs 01 und 03

SRV > INFO 00 04 00 ACK_NEEDED_DATA-Befehl
Befehl akzeptiert

INFO > SRV 00 03 00 00 NEEDED_DATA-Befehl
Befehlsvorrat 00 00: Letzter Befehl

SRV > INFO 00 04 00 ACK_NEEDED_DATA-Befehl
Befehl akzeptiert

ZUSI > SRV 00 01 01 01 04 5A 75 73 69 HELLO-Befehl
Protokoll-Version "1"
Client-Typ "Zusi"
String "Zusi" mit führender Längenangabe (4 Bytes) [zur Vereinfachung gekürzt, normalerweise meldet sich Zusi mit der Versionsnummer "Zusi Zugsimulator 2.4.3.0"]

SRV > ZUSI 00 02 00 ACK_HELLO-Befehl
Befehl akzeptiert

SRV > ZUSI 00 03 00 0A 01 02 03 NEEDED_DATA-Befehl
Befehlsvorrat 00 0A
IDs 01, 02 und 03

ZUSI > SRV 00 04 00 ACK_NEEDED_DATA-Befehl
Befehl akzeptiert

SRV > ZUSI 00 03 00 00 NEEDED_DATA-Befehl
Befehlsvorrat 00 00: Letzter Befehl

ZUSI > SRV 00 04 00 ACK_NEEDED_DATA-Befehl
Befehl akzeptiert

ZUSI > SRV 00 0A 01 04 6B 74 81
02 A2 4E 67 91
03 02 12 01 00
DATA-Befehl
Daten-IDs 01-03 Daten (konvertierter Single-Datentyp)

SRV > FP 00 0A 01 04 6B 74 81
02 A2 4E 67 91
DATA-Befehl
Daten-IDs 01 und 02 Daten (konvertierter Single-Datentyp)

SRV > INFO 00 0A 01 04 6B 74 81
03 02 12 01 00
DATA-Befehl
Daten-IDs 01 und 03 Daten (konvertierter Single-Datentyp)



Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 06.02.2012 23:59
von funkheld
Wie kann ich jetzt mit dem unteren Programm an die Ip :127.0.0.1 und Port 1435 Daten zurücksenden ?

Danke.

Gruss

Code: Alles auswählen

Global z.l

OpenConsole()

InitNetwork() 

*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, 1435)
  
  Repeat
      
    SEvent = NetworkServerEvent()
  
    If SEvent
      ClientID = EventClient()
  
      Select SEvent    
        Case #PB_NetworkEvent_Connect
          PrintN("client hat sich gemeldet...")
          
        Case #PB_NetworkEvent_Data
          PrintN("client "+Str(ClientID)+" hat gesendet...")
          PrintN("")
          ReceiveNetworkData(ClientID, *Buffer, 40)
          For z=0 To 8
            PrintN(StrU(PeekB(*Buffer+z)))
          Next z
          PrintN("")
          For z=9 To 40
            Print(Chr(PeekB(*Buffer+z)))
          Next z
          
        Case #PB_NetworkEvent_Disconnect
          PrintN("client "+Str(ClientID)+" geschlossen...")
          Quit = 1  
      EndSelect
      
    EndIf 
  Until Quit = 1 
 
  CloseNetworkServer(0)
Else
  PrintN("kann server nicht erstellen")
  Input()
EndIf

End 

Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 07.02.2012 00:27
von ts-soft
Du erstellst ja schon wieder einen Server. Es kann nur einen Server auf dem Port geben, und der
existiert doch bereits von Zusi. Also wird nur der zuerst gestartete funktionieren.

Ansonsten benötigst Du für Deinen Clienten: SendNetworkData

Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 07.02.2012 10:41
von funkheld
Hmmm.., das verstehe ich nicht.

Wenn es ein Client sein muss, der muss doch bei mir hier auch Daten Empfangen und Senden.
Er muss erst kontakt aufnehmen (Senden) und dann Daten Empfangen.

Wie bekommt man jetzt das mit einem Clienten auf der Reihe. ? :praise:

Danke.

Gruss

Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 07.02.2012 11:13
von mk-soft
Bevor noch weitere fragen kommen solltest du dich mit den Grundlagen der Kommunikation über Netzwerk beschäftigen...

http://de.wikipedia.org/wiki/Server

http://de.wikipedia.org/wiki/OSI-Modell

Viel spass bein studieren... :wink:

P.S. OSI-Model: Bis Schicht 4 ist in Purebasic vorbereitet und stellt dir entsprechende Befehle bereit.
Dabei bietet dir Purebasic die Protokolle der Schicht 4 TCP (Segmente) und UDP (Datagramme) an.
Bei UDP ist zu beachten das maximal 2048 Byte übertragen werden kann und es auch keine Rückantwort gibt ob das Datagramm angekommen ist.

Die Schicht 5 bis 7 its Deine Aufgabe.

Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 07.02.2012 11:49
von funkheld
Jup danke.
Dann kann ich ja mein Problem mit den Purebasicbefehlen nicht lösen.

Dann werde ich wohl mal eine andere Sprache raussuchen.

Danke.

Gruss.

Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 07.02.2012 12:00
von NicTheQuick
funkheld hat geschrieben:Jup danke.
Dann kann ich ja mein Problem mit den Purebasicbefehlen nicht lösen.

Dann werde ich wohl mal eine andere Sprache raussuchen.

Danke.

Gruss.
Ich glaube du hast da was falsch verstanden. Du musst nicht weiter auf die Hardwareebene runter mit den Netzwerkbefehlen. Du musst lediglich die richtigen PB-Befehle nutzen. Und zwar die, die ein Client nutzen kann.

Zuerst verbindest du dich zum Server mittels 'OpenNetworkConnection()', dann kannst du mit 'SendNetworkData()' Datenpakete zum Server senden. In eine Schleife überprüfst du dann, ob 'NetworkClientEvent()' als Ergebnis '#PB_NetworkEvent_Data' zurück gibt und falls ja, kannst du mit 'ReceiveNetworkData()' die Daten vom Server empfangen.
Das ist alles. Mehr brauchst du doch gar nicht.

Re: Client/Server in einem Programm, wie geht das mit den Ev

Verfasst: 07.02.2012 12:01
von Andreas21
Schon in der Hilfe geschaut?
OpenNetworkConnection()

Syntax

Verbindung = OpenNetworkConnection(ServerName$, Port [, Modus])
Beschreibung

Öffnet eine Netzwerk-Verbindung zum angegebenen Server.
Parameter

ServerName$ Gibt den Server an, zu dem verbunden werden soll. Dies kann eine IP-Adresse oder ein voller Name sein (d.h. "127.0.0.1" oder "ftp.home.net").
Port Gibt den Port des Servers an, zu dem verbunden werden soll (siehe auch CreateNetworkServer()).
Modus (optional) Dies kann einer der folgenden Werte sein:
#PB_Network_TCP: Die Verbindung nutzt das TCP-Netzwerk-Protokoll (Standard)
#PB_Network_UDP: Die Verbindung nutzt das UDP-Netzwerk-Protokoll.
Die Verbindung wird nicht ausdrücklich erstellt, da UDP ein "verbindungsloses" Protokoll ist, aber es wird
einen Eintrag im "PureBasic Management Stack" hinzufügen und das Senden von
Daten über UDP mittels der regulären Befehle wie z.B. SendNetworkData() ermöglichen.



Rückgabewert

Gibt den Verbindungs-Identifier für die geöffnete Verbindung zurück, wenn die Verbindung korrekt aufgebaut wurde. Wenn ein Fehler auftrat, wird das Ergebnis gleich 0 sein.
Siehe auch

NetworkClientEvent(), SendNetworkData(), ReceiveNetworkData(), CloseNetworkConnection()
Unterstützte OS

Alle
Damit wird die Verbindung aufgebaut zum Server.