TCP - Server/Client

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Vertex

Betreff: TCP - Server/Client

BeitragDi, Jul 06, 2004 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Also anscheinend gibt es hier probleme beim übertragen von Daten.
Code: [AUSKLAPPEN]
Graphics 500, 200, 32, 2
SetBuffer FrontBuffer()
AppTitle "Server"

Const msgServer = 1
Const msgClient = 2

Type client_t
   Field name$
   Field stream
End Type

Type stack_t
   Field msgType
   Field message$
   Field source
End Type

server = CreateTCPServer(1000)
If server = 0 Then
   Print "Can't create server"
   WaitKey : End
EndIf

While Not KeyDown(1)
   strClient = AcceptTCPStream(server)
   If strClient<>0 Then
      While Eof(strClient) : Wend
      client.client_t = New client_t
      client\name$    = ReadString$(strClient)
      client\stream   = strClient
      
      stack.stack_t  = New stack_t
      stack\msgType  = msgServer
      stack\message$ = client\name$+" has joined"
   EndIf
   
   For client.client_t = Each client_t
      If ReadAvail(client\stream)
         While Not Eof(client\stream)
            message$ = ReadString$(client\stream)
            If message$ = "/end" Then
               stack.stack_t  = New stack_t
               stack\msgType  = msgServer
               stack\message$ = client\name$+" quited"
               stack\source   = client\stream
               CloseTCPStream client\stream : Delete client
            Else
               stack.stack_t  = New stack_t
               stack\msgType  = msgClient
               stack\message$ = client\name$+": "+message$
               stack\source   = client\stream
            EndIf
         Wend
      EndIf
   Next
   
   For stack.stack_t = Each stack_t
      For client.client_t = Each client_t
         If stack\source<>client\stream Then
            WriteInt    client\stream, stack\msgType
            WriteString client\stream, stack\message$
         EndIf
      Next
      
      If stack\msgType = msgSerer Then
         Color 0, 255, 255
         Print stack\message$
      Else
         Color 255, 255, 255
         Print stack\message$
      EndIf
      Delete stack
   Next
Wend

For client.client_t = Each client_t
   WriteByte   client\stream, msgServer
   WriteString client\stream, "/end"
Next

CloseTCPServer server : End


Code: [AUSKLAPPEN]
Graphics 500, 200, 32, 2
SetBuffer FrontBuffer()
AppTitle "Client"

Const msgServer = 1
Const msgClient = 2

serverIP$ = Input$("IP: ")
tcp = OpenTCPStream(serverIP$, 1000)
If tcp = 0 Then
   Print "Can't connect to server"
   WaitKey : End
EndIf

nick$ = Input$("Nickname: ")
WriteString tcp, nick$

Print "Press F1 to write"

While Not KeyDown(1)
   If ReadAvail(tcp) Then
      While Not Eof(tcp)
         msgType  = ReadByte(tcp)
         message$ = ReadString$(tcp)
      
         If message$ = "/end" Then
            Color 0, 255, 255
            Print "Server has quited"
            CloseTCPStream tcp
            WaitKey : End
         EndIf
         
         If msgType = msgServer Then
            Color 0, 255, 255
            Print message$
         Else
            Color 255, 255, 255
            Print message$
         EndIf
      Wend
   EndIf
   
   If KeyHit(59) Then
      Color 255, 255, 255
      message$ = Input$("msg: ")
      WriteString tcp, message$
      If message = "/end" Then
         CloseTCPStream tcp
         End
      EndIf
   EndIf
Wend

WriteString tcp, "/end"
CloseTCPStream tcp
End



Also erstmal zum Server:
Der Type client_t speichert alle Klienten ab, die mit AcceptTCPStream ermittelt wurden. In stack_t werden Messages abgespeichert die dann alle Klienten weiter gesendet werden(durch das Field source wird jedoch geprüft, das der Klient nicht seine eigene Message bekommt).

Zum Klienten:
Es wird in der Hauptschleife ständig geprüft, ob der Server irgendetwas sendet, wenn ja, wird es dann auch angezeigt.

Das erste Byte was vom Server kommt, ist der Messagetyp, also ob das nun der Server geschrieben hat, oder ein Klient. Die eigentliche Message ist dann ein String.

Mal zu meiner Vorgehensweise:
- Server starten
- Klient starten
- Beim Klient 192.168.2.100 eingegeben (Router schaltet Port 1000 durch)
- Beim Nickname "vertex" angeben
- Server schreibt "vertex has joined"
- Beim Klienten drück ich F1, schreibe meine Message und drücke Enter
- Nix passiert auf dem Server

So wie es mir scheint, funktioniert der Klient, jedoch nicht der Server, da er anscheinend dem Klient nur einmal eine Nachricht senden kann und auch empfangen, obwohl ich den Klientstream zwischenspeichere.

Hat wer eine Idee?
mfg olli

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group