Client\Server daten übermittlung



  • Moinsen!

    Ich habe ein problem mit der Befehl versendung an den server.
    Ich wollte gerne das per knopfdruck der Server Befehle ausführt.
    Das zu realisieren habe ich so gedacht:

    void __fastcall TForm1::ServerClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    char com;
    AnsiString tmptxt = com;
    tmptxt=(Socket->ReceiveText());
     switch (com)
     {
      case 1: Application->MessageBox("Verbindung", "Erfolgreich", MB_OK);
     }
    }
    

    Wenn ich jedoch die 1 sende passiert nichts.
    Das der Server sie empfängt weiss ich da ich sie mir bereits in einem EditFeld habe anzeigen Lassen.



  • Sei so grosszügig und kommentier mal jede einzelne Zeile was sie genau machen soll. Hast du den Fehler dann noch nicht gefunden, so postest du den Code hier nochmal mit den Kommentaren.

    -junix



  • OK dann mit Kommentaren!

    void __fastcall TForm1::ServerClientRead(TObject *Sender,
                                     TCustomWinSocket *Socket)
    {
    char com;
    AnsiString tmptxt = com;              //AnsiString in char umwandeln
    tmptxt = (Socket->ReceiveText());     //Empfangenen Text an tmptxt übergeben
     switch (com)                           
     {
      case 1: Application->MessageBox("Verbindung", "Erfolgreich", MB_OK); //wenn com 1 ist MessageBox erzeugen
     }
    }
    

    [ Dieser Beitrag wurde am 16.05.2003 um 16:32 Uhr von Hasm editiert. ]



  • Original erstellt von Hasm:
    **

    AnsiString tmptxt = com;              //AnsiString in char umwandeln
    

    **

    Und dessen bist du dir sicher?

    -junix

    [ Dieser Beitrag wurde am 16.05.2003 um 16:33 Uhr von junix editiert. ]



  • Nein bin ich net!
    Aber was anderes iss mir net eingefalln.



  • Öhm... überleg dir nochmal die Reihenfolge...

    .. besonders die Zuweisung von com und tmptext und dem Zeitpunkt der Befüllung..

    *winkt mit Gartenzaun*



  • Kann man mir nicht einfach sagen was falsch ist?



  • Kann man... dann geht aber der Lerneffekt flöten.. j/k

    Also nen AnsiString wandelst du einmal nicht in den Typ char um indem du ihm nen char zuweist. 🙂
    Und dann würde ich auf die Variable abprüfen die du befüllst...
    denn du fragst com nach einem Wert den tmptxt von dir zugewiesen bekommen hat.
    Da kommt dann erwiesenermaßen nix bei rum....



  • Und mit welchen Befehl wandle ich Ansistring in char um?



  • Brauchst du nicht...

    frag dann einfach nach tmptxt[1] ab...

    switch (tmptxt[1]) //erstes Feld im Array des AnsiStrings                          
    {
      case '1': Application->MessageBox("Verbindung", "Erfolgreich", MB_OK); //wenn com 1 ist MessageBox erzeugen
     }
    

    Sollte gehen... Happy Weekend!



  • In dem Zusammenhang dürfte wohl das hier noch interessant sein: TServerSocket

    -junix



  • Jetzt habe ich nur noch ein einziges problem.
    Ich habe die Werte um sie eindeutig als Befehle festzulegen und von den Chat Text abzuheben als ' 1,~1','~2','~3' festgelegt. Bsp. switch (tmptxt[3]) { case '~1':Application->MessageBox("Verbindung", "Erfolgreich", MB_OK); break;
    }
    Ich bekomme nun jedoch eine Fehlermeldung wen ich im Chatfenster $, ~, oder eine der Festgelegten Zahlen angebe.
    Wie kann ich das unterbinden?



  • $~1 etc. sind ZeichenFOLGEN... Du greifst in deiner switch-anweisung auf ein einzelnes Zeichen zu... Wie soll das denn funktionieren?
    Mal ne Frage... Wie sieht dein Chat-Programm eigentlich sonst so aus?
    Was steht zu dem eben genannten Zeitpunkt überhaupt in tmptxt drin?



  • und wie kann ich auf Zeichenfolgen zugreifen?



  • HI,
    mit switch geht das nicht! Nur mit if !

    MFG

    Alexander Sulfrian



  • Client Seite:

    ClientSocket->Socket->SendText=(1);
    

    Server Seite:

    int id;
    
    id=Socket->ReceiveText();
    
    switch(id)
    {
    case 1: Application->Terminate();
    break;
    case 2: .....
    break;
    }
    

    Kannst für jedes Ereignis ne Eigene ID machen.
    über die switch/case Anweis8ng kannste die Ereignise auslösen.

    Wenn du was bracuhst wo du nen Ereignis ausklösen willst, das jedesmal nen neuen Zusatzwert hat, meld dich. Da hab ich auch was.



  • Original erstellt von Thargor:
    **Client Seite:

    ClientSocket->Socket->SendText=(1);
    

    Server Seite:

    int id;
    
    id=Socket->ReceiveText();
    
    switch(id)
    {
    case 1: Application->Terminate();
    break;
    case 2: .....
    break;
    }
    

    **

    Hi,
    im Prinzip ist das ja soetwas wie ein Protokoll!
    Ähm aber was soll das (der falsche Code)?

    Ich meine:

    ClientSocket->Socket->SendText=(1);
    

    währe das nicht besser so:

    ClientSocket->Socket->SendText(IntToStr(1));
    
    // oder 
    
    ClientSocket->Socket->SendText("1");
    

    und

    int id;
    id=Socket->ReceiveText();
    

    Wie stellst du dir von, dass es einen Text (AnsiString) automatisch in einen int umwandeln kann?
    Wenn dann müsstest, du schon das so schreiben:

    int id = IntToStr(Socket->ReceiveText());
    
    // oder bei einem Protokoll, wo z.B. das 1. Zeichen die Anweisungsart angibt:
    
    String Anweisung = Socket->ReceiveText();
    int id = IntToStr(Anweisung[1]);
    

    Und dann noch was: Du könntes ruhig ein bischen den Code einrücken! So z.B.:

    switch(id)
    {
     case 1: Application->Terminate();
             break;
     case 2: .....
             break;
    }
    

    Ist IMHO besser leserlich!

    Naja sonst ist das ja keine neue Idee! (s. Protokoll)

    MFG

    Alexander Sulfrian

    [ Dieser Beitrag wurde am 18.05.2003 um 00:13 Uhr von Alexander Sulfrian editiert. ]



  • Naja.

    Sowie ich es da stehen habe funzt es bei mir. Hab mich auch gewundert.

    Sorry wegen den Text. Normalerweiße mach ich das.

    Naja. Ehrlich gesagt habe ich über Protokollenichts gelesen. Wusste net mal das das eins is. Hab ich mir halt mal so ausgedacht für mein aktuelles Projekt.



  • Original erstellt von Thargor:
    Ehrlich gesagt habe ich über Protokolle nichts gelesen.

    Hi,
    hast du schon mal auf den Link auf der 1. Seite des Threads geklickt?

    MFG

    Alexander Sulfrian

    PS: Endlich funkt die I-Net Verbindung auch unter Linux!



  • Ne. Hab ich net gemacht.

    Aber bei mir klappt j aalles im Projekt.



  • Das Versäumnis nachholen wär sehr sinnvoll(!)

    -junix


Anmelden zum Antworten