Kommunikation zwischen Server und Client

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Toasty

Betreff: Kommunikation zwischen Server und Client

BeitragDi, Mai 04, 2010 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich hab mal ne Frage:

Ich bin wieder dabei mein Online Game mit BB zu schreiben,
aber jetzt habe ich ein Problem mit TCP...
Wenn der Client eine Anfrage zum Server schickt, bekommt die Server App die Anfrage, nur dann kommt ein Runtime Error... (Illigal memory Adress)

BlitzBasic: [AUSKLAPPEN]

;...
Repeat
If req Then Exit
req=AcceptTCPStream(self)
Forever

socket$=ReadString(self)
Print"Any Client("+ socket$ +") sent request"

client=OpenTCPStream(socket$,201)
If Not client Then Print"DC_CLIENT":req=False:Goto dc

WriteString client,"GiveChar"
Print"Waiting for Playername"
;...


Da die Server App nochnicht
BlitzBasic: [AUSKLAPPEN]
Print"Any Client("+ socket$v+") sent reqeust"

angezeigt hat, gehe ich davon aus das der Fehler bei
BlitzBasic: [AUSKLAPPEN]
socket$=ReadString(self)

liegt.
Wenn ich allerdings
BlitzBasic: [AUSKLAPPEN]
socket$=ReadString(self)

in
BlitzBasic: [AUSKLAPPEN]
socket$=ReadString(req)

umänder, wird "Any Client("+ socket$ +") sent request" angezeigt.
Aber die Variable socket$ vertretet dann komischerweise "1".

Was ist das Problem?

Starwar

BeitragDi, Mai 04, 2010 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If req Then Exit
req=AcceptTCPStream(self)
Forever

Code: [AUSKLAPPEN]
socket$=ReadString(self)

AcceptTCPStream ->bei ReadString req statt self

Code: [AUSKLAPPEN]
client=OpenTCPStream(socket$,201)

Wozu ist das? Ich verstehe dein Programmablauf nicht... Bitte erklärs mir Smile

MFG
PS: Goto ist böse Wink
 

Toasty

BeitragDi, Mai 04, 2010 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das ist eine Schleife, die immerwieder abfragt, ob ein Client nach Login fragt...

Aber AcceptTCPStream() ist doch schon req ...

Gruß Toasty

PS: Was kann ich denn sonst benutzen wenn er die Schleife erneut starten soll?

Starwar

BeitragDi, Mai 04, 2010 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst einen Type erstellen, in dem du die Streams speicherst die dir AcceptTCPStream zurückliefert. Diese Streams sind direkte Leitungen zu den Clients.
Du kannst mit einer For-Each-Schleife den Type durchgehen und jeden Stream mit ReadAvail checken ob er Daten liefert und dann bei bedarf auslesen.
Das AcceptTCPStream bleibt in der Hauptschleife.
Pseudo-Code: [AUSKLAPPEN]
server=CreateTCPServer(port%)
Repeat
   If neu=AcceptTCPStream(server) Then
      s.client = New client
      s\stream=neu
   EndIf
   For s.client = Each client
      If Not s\stream Then
         ;Bin ich mir nicht 100%ig sicher
         Delete s ;Client offline
      Else
         If bytes=ReadAvail(s\stream) > 0 Then
            ;Daten auslesen
         EndIf
      EndIf
   Next
Until KeyDown(1)
CloseTCPServer(server)

Type client
   Field stream
End Type


EDIT: Du kannst mit ReadByte byteweise auslesen und zurück nach ASCII wandeln Chr. Oder ReadLine. Da EOF nützlich.

Schreiben kannst du in die streams, die per AcceptTCPStream kommen natürlich auch.

MFG

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group