benötige Hilfe bei TCP-Chat

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

ClayC

Betreff: benötige Hilfe bei TCP-Chat

BeitragMi, Jun 24, 2009 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi all!

Ich bin dabei einen TCP-Chat zu schreiben (bnetex), das mit den Modulen funkt alles von daher gibts keine Probleme

Hab eigentlich nur die examples von bnetex umgeschrieben (tcpserver und tcpclient), will das Ganze aber in eine GUI einbauen, die GUI steht und funktioniert soweit, das Problem liegt beim Client.

Dieser empfängt nur Daten wenn ich in der GUI etwas mache, eben weil ich das ganze innerhalb der "Select EventID()" laufen lasse, ich weiß aber nicht wie ich den Client umschreiben soll dass das Ganze funktioniert.

Würd mich über Tipps freuen wie ich den umschreiben soll damit der Chat auch in der GUI funktioniert.
Der Code ist ziemlich bescheiden sag ich mal also bitte nicht aufregen^^ Ich versteh auch eben (noch) nicht was die einzelnen Zeilen so machen Embarassed


Hier der Client


Code: [AUSKLAPPEN]
SuperStrict

Import vertex.BNetEx
Import maxgui.drivers
Import brl.LinkedList

Local window:TGadget = CreateWindow("Chat oida", 10, 30, 650, 650, Null, WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS)

Global Chatfenster:TGadget = CreateTextArea (20, 30, 600, 500, window:TGadget, TEXTAREA_WORDWRAP)
Global Eingabefenster:TGadget = CreateTextField (20, 530, 500, 50, window)
Global IPFenster:TGadget = CreateTextField (20, 600, 100, 20, window)
Local button:TGadget
Local buttonIP:TGadget
button = CreateButton("OK", 550, 530, 50, 50, window, BUTTON_OK)
buttonIP = CreateButton("OK", 150, 600, 20, 20, window, BUTTON_OK)

Global canvas:TGadget = CreateCanvas(90, 30, 520, 520, window)

Global eingabe:String
Global nachricht:String
Global Okgedruckt:Int
Global name:String
Global namensflag:Int
Global namensflag2:Int

Global HOST:String
Const PATH    : String = "/"
Const TIMEOUT:Int = 50

Global IP     : Int, ..
       Client : TTCPStream, ..
       Start:Int
Global Message:String
Global Server:TTCPStream,  ..
       ClientsA:TList,  ..
       ClientA:TTCPStream
Global Antwort:String
Global Antwort2:String


SetTextAreaText Chatfenster, "Bitte Namen in das Eingabefeld eingeben und mit Ok bestätigen ~nBitte in das untere Fenster die Server-IP eingeben und ebenfalls mit Ok bestätigen ~n"


While WaitEvent()

Select EventID()

   Case EVENT_WINDOWCLOSE
        FreeGadget canvas
   End
   
   Case EVENT_GADGETACTION
      Select EventSource()
         
         Case buttonIp
            HOST = TextFieldText(IPFenster)
            AddTextAreaText Chatfenster, "die Server-Ip lautet: " + HOST + "~n"
         
      
         Case button
         
         If Okgedruckt = 0
            SetGadgetText(Chatfenster, "")
            name = TextFieldText(Eingabefenster)
            AddTextAreaText Chatfenster, "Willkommen im Say Chess Chat Fun " + name + "!" + "~n"
         End If
         
      
            
         eingabe = TextFieldText(Eingabefenster)
         
         SetGadgetText(Eingabefenster, "")

         Okgedruckt = 1
         ActivateGadget Eingabefenster                  

         End Select
                           
         Try

               IP = TNetwork.GetHostIP(HOST)
               If Not IP Then Throw("Host not found")
               
               Client = New TTCPStream
               If Not Client.Init() Then Throw("Can't create socket")
               Client.SetTimeouts(TIMEOUT, TIMEOUT)
               If Not Client.SetLocalPort() Then Throw("Can't set local port")
               Client.SetRemoteIP(IP)
               Client.SetRemotePort(80)
               If Not Client.Connect() Then Throw("Can't connect to host")
               
                  If namensflag2 = 0
                     Message = "neuer User im Chat: " + eingabe + " ~n"
                     
                  End If
                  
                  If namensflag2 = 1
                     Message = CurrentTime:String() + " " + name + ": " + eingabe
                  End If
               
               namensflag2 = 1
               
               Select EventSource()
                  Case button
                  
                  Client.WriteLine(Message)
                  Message = Left (Client.ReadString(256), 256)
                  
                  
               End Select
                                          
               While Client.SendMsg() ; Wend
               
               Start = MilliSecs()
               Repeat
                  Local Result:Int
               
                  If MilliSecs() - Start > TIMEOUT Then Throw("Timeout")
               
                  Result = Client.RecvAvail()
                  If Result = -1 Then
                     Throw("Socket Error")
                  ElseIf Result > 0 Then
                     Exit
                  EndIf
               Forever
               
               While Client.RecvMsg() ; Wend
               
               'Select EventSource()
               'Case Button
               
               While Not Client.Eof()
   
                     Antwort = Left (Client.ReadString(256), 256)
               
                     If namensflag = 1
                        AddTextAreaText Chatfenster, Antwort
                        
                     End If
                     namensflag = 1
                     
                                                               
               Wend
               
               If Server.Eof()
                  
                  Antwort = Left (ClientA.ReadString(256), 256)
                  AddTextAreaText Chatfenster, Antwort
               
                  'Client.WriteLine(Message)
                  
               End If
               
               
               
               'End Select
               
            Catch Exception:Object
               WriteStdout("Error:~n " + Exception.ToString())
            End Try

            If Client Then Client.Close()
            WriteStdout("~n- ready -~n")
            'End

   
   
End Select

Wend


Hier der Server

Code: [AUSKLAPPEN]
SuperStrict

Import vertex.BNetEx
Import maxgui.drivers
Import Brl.LinkedList

Global Timer:TTimer

Timer = CreateTimer(60)

Global Server:TTCPStream
Global ClientsA:TList,  ..
       ClientA:TTCPStream
Global nachricht:String
Global eingabe2:String
Global Okgedruckt:Int
Global name:String
Global Lange:Int
   
Global message:String
Global message2:String

Local window:TGadget = CreateWindow("Chatserver oida", 10, 30, 650, 650, Null, WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS)

Global Chatfenster:TGadget = CreateTextArea (20, 30, 600, 500, window:TGadget, TEXTAREA_WORDWRAP)
Global Eingabefenster:TGadget = CreateTextField (20, 530, 500, 50, window)
Global IPFenster:TGadget = CreateTextField (20, 600, 100, 20, window)

Global button:TGadget
button = CreateButton("OK", 550, 530, 50, 50, window, BUTTON_OK)

Global canvas:TGadget = CreateCanvas(90, 30, 520, 520, window)



SetTextAreaText Chatfenster, "Bitte Namen in das Eingabefeld eingeben und mit Ok bestätigen ~n"


Try

Server = New TTCPStream
If Not Server.Init() Then Throw("Can't create socket")
If Not Server.SetLocalPort(80) Then Throw("Can't set local port")
If Not Server.Listen() Then Throw("Can't set to listen")

ClientsA = New TList

   
Repeat

WaitTimer Timer
         
         

         While PollEvent()
         
         Select EventID()

         Case EVENT_WINDOWCLOSE
                 FreeGadget canvas
               End
               
         Case EVENT_GADGETACTION
                              
            Select EventSource()
               Case button
               
               If Okgedruckt = 0
               SetGadgetText(Chatfenster, "")         
               name = TextFieldText(Eingabefenster)
               AddTextAreaText Chatfenster, "Willkommen im Say Chess Chat Fun " + name + "!" + "~n"
                  
               End If
               
               
               eingabe2 = TextFieldText(Eingabefenster)
               SetGadgetText(Eingabefenster, "")
               
               Okgedruckt = 1
               ActivateGadget Eingabefenster
               
               'message = eingabe
               'AddTextAreaText Chatfenster, message
               'ClientA.WriteString(message)
               AddTextAreaText Chatfenster, CurrentTime:String() + " " + name + ": " + eingabe2 + "~n"
               
               End Select
            End Select
         Wend
      
   ClientA = Server.Accept()

   If ClientA Then
      WriteStdout("New Client:~n" + ..
                  " - IP:" + TNetwork.StringIP(ClientA.GetLocalIP()) + "~n" + ..
                  " - Port:" + ClientA.GetLocalPort() + "~n")
      ClientsA.AddLast(ClientA)
   EndIf

   For ClientA = EachIn ClientsA
      If ClientA.GetState() <> 1 Then
      WriteStdout("Client disconnected:~n" + ..
                  " - IP:" + TNetwork.StringIP(ClientA.GetLocalIP()) + "~n" + ..
                  " - Port:" + ClientA.GetLocalPort() + "~n")
         ClientA.Close()
         ClientsA.Remove(ClientA)
         Continue
      EndIf

      If ClientA.RecvAvail() Then
         While ClientA.RecvMsg() ; Wend

         If ClientA.Size() > 0 Then
            WriteStdout("Message from client:~n" + ..
                        " - IP:" + TNetwork.StringIP(ClientA.GetLocalIP()) + "~n" + ..
                        " - Port:" + ClientA.GetLocalPort() + "~n")
            While Not ClientA.Eof()
               
               message = Left (ClientA.ReadString(256), 256)
               message2 = CurrentTime:String() + " " + name + ": " + eingabe2 + "~n"
               
               Print "nachrichtanclient2: " + message2 + "~n"
               Print "nachrichtanclient: " + message + "~n"
               
               
               AddTextAreaText Chatfenster, message
               ClientA.WriteString(message)
               
               Rem
               Lange = Len message2
               
               If Lange > 0
               ClientA.WriteString(message2)
               Print "huhu"
               End If
               
               message2 = ""
               End Rem
               
               ClientA.WriteString(message2)
                                       
            Wend
            
            While ClientA.SendMsg() ; Wend
         EndIf
      EndIf
   Next
   
   
Forever


Catch Exception:Object
   WriteStdout("Error~n " + Exception.ToString())
End Try

If Server Then Server.Close()
WriteStdout("~n- ready -~n")
End


das mit Global und Local Variablen lassen wir auch mal, das ist eine andere Geschichte Laughing
 

ClayC

BeitragMo, Jul 06, 2009 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Anscheinend ist die einzige Möglichkeit MultiThreading wenn ich das ganze in dem Sinne weiterverfolge und zu Ergebnisse komme werd ich das ganze hier reinstellen.

btw: kennt jemand ein gutes Tut oder how-to?

Lastmayday

BeitragMo, Jul 06, 2009 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
die lösung steht im server...

-> While WaitEvent() ' das programm wartet solange bis es ein gui event gibt

-> While PollEvent() ' schleife wird ausgeführt solange es ein gui event gibt


und vergesse nicht
-> WaitTimer Timer
sonst hast du ne große cpu auslastung

ty...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group