AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TIdTCPServer (Indy) und TClientSocket

TIdTCPServer (Indy) und TClientSocket

Ein Thema von Schwedenbitter · begonnen am 15. Nov 2016 · letzter Beitrag vom 17. Nov 2016
Antwort Antwort
Seite 1 von 3  1 23   
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

TIdTCPServer (Indy) und TClientSocket

  Alt 15. Nov 2016, 16:12
Hallo,

ich stehe vor folgendem Problem:
ich benötige einen TCP-Server, der auf einem Linux-System mit wine laufen kann. Das funktioniert offenbar mit den Indys. Ich habe breits diesen Code gefunden, der fast funktioniert. Ich kann eine Verbindung herstellen zwischen dem Server-Programm und dem TClientSocket herstellen. Und Daten, die ich mit AContext.Connection.IOHandler.WriteLn('Willkommen'); vom Server sende, kommen am Client auch an.

Ich habe aber das Problem, dass es umgekehrt nicht klappt. Wenn ich also mit TClientSocket.Socket.SendText('Hello World'); etwas vom Client sende, kommt nichts beim Server an. Es wird noch nicht einmal das Ereignis TIdTCPServer.OnExecute(AContext: TIdContext); ausgelöst.

Kann mir jemand erklären, woran das liegt?
Falls ja, gibt es Abhilfemöglichkeiten?

Den Quellcode habe ich angehängt. Es sind meine Anfänge mit den Indys und ich habe mitbekommen, dass es da diverse Unterschiede in den Versionen gibt, die zu Problemen führen. bei diesem Projekt benutze ich Delphi XE5.

Gruß, Alex
Angehängte Dateien
Dateityp: zip TCP-Mix_1.zip (3,1 KB, 6x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.571 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 15. Nov 2016, 16:21
Hallo,

Firewall, seLinux.
Alternativ kannst Du auf dem Server mal nc -l <Dein Port> starten
und dann versuchen dich mit dem Client zu verbinden.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 15. Nov 2016, 16:56
Danke für die Antwort.
Firewall, seLinux.
Das ist immer das erste, was ich bei Tests mit dem Netzwerk deaktiviere, um "Irritationen" zu vermeiden
Aber daran liegt es nicht, weil dasselbe Problem auch auftritt, wenn ich das auf demselben oder anderen Windows-Rechnern mache. Es liegt also gar nicht an Linux...

Alternativ kannst Du auf dem Server mal nc -l <Dein Port> starten
und dann versuchen dich mit dem Client zu verbinden.
Siehe oben. Aber ich werde es mir merken, wenn es mal unter Windows läuft und es dann Probleme unter Linux geben sollte.

[EDIT]
Ich hatte schon verschiedene Strings (Ansi, Wide, Short) im Verdacht.
Aber das kann es nicht sein. Denn dann müsste zum einen ja das Ereignis zumindest ausgelöst werden und er müsste mir dann irgend welchen Datenmüll anzeigen. TClientSocket nutzt AnsiString und - wenn ich das richtig den Quellen entnommen habe - ist es bei den Indys auch AnsiString. Also theoretisch alles im grünen Bereich.
[/EDIT]

Gruß, Alex
Alex Winzer

Geändert von Schwedenbitter (15. Nov 2016 um 16:59 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 16. Nov 2016, 14:06
Offenbar hängt es schon an Delphi - oder meinen bescheidenen Programmierkünsten:

Ich habe mir zu Testzwecken die Mühe gemacht und auf einem Form "schnell" mal je Server und Client der Indys und einen TClientSocket platziert und mit Code unterlegt. Ich kann das auch anhängen, falls jemand Interesse hat.

Der Indy-Client kann etwas an den Indy-Server senden - hätte mich auch gewundert, wenn es nicht so gewesen wäre. Mit dem TClientSocket kann ich mich immerhin noch zum TIdTCPServer verbinden. Aber wenn ich mit ClientSocket.Socket.SendText('Hello World'); etwas absetze, kommt das aus mir unerfindlichen Gründen nicht an - genau wie bei den getrennten Programmen. Das Ereignis wird auch hier nicht ausgelöst

Jetzt wollte ich gern testen, ob es umgekehrt klappt, vom Server etwas an TClientSocket zu senden. Bedauerlicher Weise hängt sich folgender Code (den ich im www gefunden habe) ohne jedwede Fehlermeldung auf; selbst das Senden an den Indy-Client klappt somit nicht:
Delphi-Quellcode:
Procedure TForm1.BtnBrdcastClick(Sender: TObject);
Var
   CList            : TList;
   I               : Integer;
Begin
   CList:= IdTCPServer.Contexts.LockList;
   Try
      For I:= 0 To Pred(CList.Count) Do
      Try
         TIdContext(CList[I]).Connection.SendCmd(EDBrdCast.Text);
      Except End;
   Finally
      IdTCPServer.Contexts.UnlockList;
   End;
End;
Kann mit dazu jemand etwas sagen?

Ich würde wirkllich gern den Indy-Server und den Delphi-Client miteinander verbinden. So schnell will ich da nicht aufgeben. Aber ich finde schon jetzt, dass die Indys vergleichsweise unhandlich sind und merkwürdig reagieren...

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.583 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 16. Nov 2016, 16:22
Ich weiß nicht ob es richtig ist was ich jetzt sage, aber ich hatte so etwas auch mal testweise ausprobiert.

Beim Zugriff auf die LockList wird ein SperrFlag gesetzt welches mit UnlockList aufgehoben wird. Das Problem bei mir war allerdings, dann ich, egal ob ich mir die Instanz zwischengespeichert habe oder nicht, pro Zugriff auf die LockList ein UnlockList aufrufen musste.

Erst dann hat es funktioniert. Aber ich dachte mir damals schon, dass das nicht richtig sein kann. Eventuell findet sich ja jemand der das schon gemacht hat.

Stahli hat doch aktuell so ein Socket Framework gebaut wenn ich mich recht erinnere. Ob das allerdings etwas damit zu tun hat weiß ich nicht.
  Mit Zitat antworten Zitat
Bambini
(Gast)

n/a Beiträge
 
#6

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 16. Nov 2016, 16:45
http://stackoverflow.com/questions/3...texts-locklist
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 16. Nov 2016, 20:15
Dank des Quellcodes in C++ (?) von Bambini habe ich es geschafft:
Delphi-Quellcode:
Procedure TForm1.BtnBrdcastClick(Sender: TObject);
Var
   CList         : TList;
   I            : Integer;
Begin
   CList:= IdTCPServer.Contexts.LockList;
   Try
      For I:= 0 To Pred(CList.Count) Do
      Try
         TIdContext(CList.Items[I]).Connection.IOHandler.WriteLn(EDBrdCast.Text);
         TIdContext(CList.Items[I]).Connection.IOHandler.WriteBufferFlush;
      Except End;
   Finally
      IdTCPServer.Contexts.UnlockList;
   End;
End;
Einen Fehler ("Items[I]" statt nur "[I]") und eine Unwissenheit (WriteBufferFlush fehlte ganz) habe ich ausgemerzt.

Besonders "lustig" ist nun, dass ich die Strings mittels Ereignis mit System.Win.ScktComp.TClientSocket erhalte. Empfangen funktioniert also, senden leider nicht - wie unpraktisch. Jetzt suche ich in IdTCPClient.TIdTCPClient eine Möglichkeit, die Daten abzurufen. Die Ereignisse habe ich alle durchprobiert. Da tut sich leider nichts. Es ist so unschön, dass ich irgendwie kein Tutorial finde, in dem einmal die Kommunikation vollständig aufgezeigt wird.

Ist es wirklich so, dass man die Daten "von Hand" über ein Polling auslesen muss? Ooch man!

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.187 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 16. Nov 2016, 21:12
Ich hatte hier noch nichts beigetragen, weil ich nicht wusste, ob ich das Problem überhaupt richtig verstanden habe.
Da ich aber angesprochen wurde versuche ich mal was ins blaue...

Indy funktioniert immer blockierend.
Client fragt beim Server an und wartet auf Antwort.
Der Server startet Threads für die Verarbeitung der Anfrage.

Hierzu mal ein älterer Beitrag:
http://www.delphipraxis.net/171226-i...o-clients.html



Ich habe jetzt mal eine asynchrone Kommunikation getestet:
http://www.delphipraxis.net/190482-s...ockettest.html

Das funktioniert anscheinend richtig gut und ich bin dabei, mein echtes Projekt von Indy darauf umzustellen.
Die Sockets funktionieren aber m.E. in dieser Form nur unter Windows.

Falls das irgendwann doch Probleme macht, könnte ich dies auch wieder auf Indy oder etwas anderes umstellen, da Server und Clients im Grunde "Message-Objekte" austauschen, die mein Package automatisiert ordnet, zerlegt, überträgt, wieder herstellt und auf der Empfangsseite zur Verarbeitung bereitstellt.
Ob die Übertragung dabei über Sockets oder Indy bzw. asynchron oder blockierend erfolgt ist dann eher nebensächlich.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 16. Nov 2016, 22:10
Danke.

Ich hätte furchtbar gern die Sockets von Delphi genutzt. Aber ich habe das Problem, dass diese sich faktisch nicht aus der VCL lösen lassen und ich damit mit Linux/Wine scheitere. "Das funktioniert anscheinend richtig gut." kann ich nur bestätigten, nützt mir aber nichts
Ich wollte deshalb wenigstens auf der Client-Seite bei den Sockets bleiben, damit ich nicht alles neu programmieren muss. Aber irgendwie kommt vom TClientSocket nichts beim TIdTCPServer an.

Blockierend bedeutet, dass ich lesen kann, dann aber meine GUI hängt oder ich es in einen Thread auslagere, richtig? Ich habe mich für Letzteres entschieden und jetzt mal wieder Quellcode angehängt. Beteiligt an der Spielerei sind TClientSocket, TIdTCPClient und TIdTCPServer.

Nach meinem beschränkten Verständnis sollte doch beim Senden vom Server wenigstens irgend etwas ankommen - also zumindest das Ereignis ausgelöst werden. Ich bin immer noch nicht dahiner gestiegen, warum das so ist

[OT]
Ein weiteres lustiges Phänomen ist auch, dass der TIdTCPServer offenbar ein Problem damit hat, die richtige Anzahl der verbundenen Clients zu liefern. Auch hierzu habe ich mich eines Codes aus dem www bedient, der jedoch merkwürdige Werte liefert. Aber dazu mache ich ggf. ein anderes Thema auf ...
[/OT]
Miniaturansicht angehängter Grafiken
gui_1.png  
Angehängte Dateien
Dateityp: zip Indy.Test.zip (3,4 KB, 10x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
Bambini
(Gast)

n/a Beiträge
 
#10

AW: TIdTCPServer (Indy) und TClientSocket

  Alt 17. Nov 2016, 09:19
Aber irgendwie kommt vom TClientSocket nichts beim TIdTCPServer an.
Du machst in deinem IdTCPServerExecute auf Server Seite ein ReadLn().
Daher musst du auch ein "Satz" mit CR/LF schicken. Also noch ein +#13#10 dranhängen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 04:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf