Senden und empfangen über TCP, mit B+ von ??? |
Erstelle 2 Programme mit dem gleichen Quelltext. In dem einen ist: port_in = 20000 port_out = 20001 und im anderen: port_in = 20001 port_out = 20000 Also port_in und port_out vertauscht... Kurzerklärung: Es wird ein nicht editierbares AusgabeFenster (text_out) und ein editierbares EingabeFenster (text_in) erstellt. Über eine Event-Zeitsteuerung Case $4001 in Verbindung mit timer=CreateTimer(10) wird der Server-Empfang stream_in = AcceptTCPStream(server) 10 mal in der Sekunde auf empfangene Daten überprüft. Wen Empfangene Daten anliegen, werden diese über AddTextAreaText text_out, "empfang > "+ ReadLine$(stream_in) +nl$ ausgelesen und auf text_out aus gegeben. nl$ bedeutet NewLine und enthält Chr$(13) also ein Enter für neue Linie/Zeile. Sonst wird alles in einer Zeile geschrieben. Die Eingabe und das Senden geschieht folgendermasen: Über Case $401 wird überprüft ob ein Gadget Action stattfand und mit EventSource()=text_in wird überprüft ob die Aktion vom Eingabefenster kam. EventData()=13 überprüft ob dann die Eingabetaste (Enter) gedrückt wurde. Wen diese 3 Bedinungen stimmen wird ein Ausgangs-Stream (stream_out)erstellt und überprüft ob eine Verbindung (stream_out<>0) zum anderen Fenster erstellt werden konnte. Erst jetzt werden über TextFieldText$(text_in) die Zeile die man eingeben hat in chars$ eingelesen. Dieser wird mit WriteLine stream_out, chars$ über den TCP-Stream an das andere Fenster gesendet. Der Text-Inhalt von TextField (text_in) wird durch SetGadgatText gelöscht und der Stream wird geschlossen. Das es jetzt aussieht wie ein Chat wird der Eingegebene Text noch über AddTextAreaText an das eigene text_out ausgebenen. Eigentlich ist es nicht so schwer, da alles auf festen Regeln und Abläufen besteht. 1) warte auf Event (ein Ereignis) 2) auswerten des Ereignis (Timer, Tastendruck Eingabe) 3) Reaktion auf das erwartete Ereignis (Ausgabe eines Text) Also genau nach dem EVA Prinip: Eingabe => Verarbeitung => Ausgabe [code:1:a0e4c73205] wx = 400 wy = 430 dx = GadgetWidth(Desktop())/2 - wx/2 dy = GadgetHeight(Desktop())/2 - wy/2 win = CreateWindow("Server", 10, 10, wx, wy, 0, 1+8) text_out = CreateTextArea(10, 10, 400-26, 400-70, win) DisableGadget text_out text_in = CreateTextField(10, 350, 400-26, 20, win) ;############################################### Global nl$ = Chr$(13) port_in = 20000 port_out = 20001 server = CreateTCPServer(port_in) If server <> 0 Then AddTextAreaText text_out, "Server ist Online" +nl$+nl$ Else AddTextAreaText text_out, "Server fehler" +nl$+nl$ EndIf ;############################################### timer = CreateTimer(10) ;--- While Not KeyHit(1) Select WaitEvent() Case $803 ; Ende End Case $4001 ; zeitgesteuerer Empfang If EventSource() = timer Then SetStatusText win, (1000/(MilliSecs()-tt)) +" fps" tt=MilliSecs() stream_in = AcceptTCPStream(server) If stream_in > 0 Then If ReadAvail(stream_in) > 0 Then AddTextAreaText text_out, "empfang > "+ ReadLine$(stream_in) +nl$ EndIf EndIf EndIf Case $401 ; event-gesteuertes Senden If EventSource()=text_in Then If EventData() = 13 Then stream_out = OpenTCPStream("127.0.0.1",port_out) If stream_out <> 0 Then chars$ = TextFieldText$(text_in) WriteLine stream_out, chars$ SetGadgetText text_in, "" CloseTCPStream stream_out AddTextAreaText text_out, "senden > " + chars$ +nl$ EndIf EndIf EndIf End Select Wend End [/code:1:a0e4c73205] |