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

Anfängerfragen zum Programmieren mit PureBasic.
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

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

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

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

Beitrag 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)


funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

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

Beitrag 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 
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

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

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
funkheld
Beiträge: 649
Registriert: 31.12.2009 11:58

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

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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.
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

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

Beitrag 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.
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Antworten