benötige Hilfe bei TCP-Chat
Übersicht

ClayCBetreff: benötige Hilfe bei TCP-Chat |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() |
||
ClayC |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group