Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TcpServer ----> TcpClient senden und empfangen (https://www.delphipraxis.net/82849-tcpserver-tcpclient-senden-und-empfangen.html)

jokerfacehro 20. Dez 2006 17:07


TcpServer ----> TcpClient senden und empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mich seit 2 Tagen mit der Suche von hilfreichen Seitenbeschäftigt und so einiges gefunden.
Darauf hin habe ich es mit WinSocket, TcpClient/TcpServer und IdTcpClient/IdTcpClient probiert.
Ich habe mit TcpClient/Server geschafft, per bmBlocking Daten vom Client an den Server zu senden.
Das Ganze soll ein kleiner Chat werden ;)

per
Delphi-Quellcode:
SendLn('hallo');
vom Client
und das ganze mit
dem
Delphi-Quellcode:
OnAccept
auf dem Server abgefangen

alles wunderbar.

will ich jetzt vom Server zum Client senden klappt das nicht.
ich habe mir schon einiges mit mbNonBlocking angeguckt und auch selbst ausprobiert,
doch wenn ich den Client auf NonBlocking stelle empfängt mein server nicht richtig,
ab und zu klappt es, doch meistens kommt garnichts an und ich kriege auch einen socket error.
ich teste das ganze per localhost, sollte ja kein problem sein.


hmmm ich komm nicht drauf...

vielleicht hat jemand eine idee? ;)

hier mein proggi im anhang

Edit: neue version ist weiter unten

jokerfacehro 20. Dez 2006 17:44

Re: TcpServer ----> TcpClient senden und empfangen
 
ich habe einen forumeintrag über client threads gefunden, das ist allerdings für NonBlocking ;/
http://delphi.newswhat.com/geoxml/fo...s.t-online.com

http://delphi.newswhat.com/geoxml/fo...ps.borland.com

jokerfacehro 21. Dez 2006 07:09

Re: TcpServer ----> TcpClient senden und empfangen
 
ich komm einfach nicht weiter
Kann bitte jemand helfen :mrgreen:

Aenogym 21. Dez 2006 07:17

Re: TcpServer ----> TcpClient senden und empfangen
 
moin,

also ich persönlich kann dir dieses tutorial empfehlen :) es setzt auf die TServerSocket und TClientSocket-Komponenten auf. Da kann mans chon einiges lernen. danach kannst du dich ja mit indy beschäftigen, was weitaus mächtiger ist :)

grüße (nach rostock?^^)
aeno

jokerfacehro 21. Dez 2006 07:26

Re: TcpServer ----> TcpClient senden und empfangen
 
Hey !
danke für den tipp ;)
das winsocket tutorial hab ich mir gestern angesehen und gleichzeitig ein zweites,
ich habe mir einfach das tutorial als testprogramm zusammengestellt und geschaut ob das hinhaut.

und da kamen gleich schöne synchronisations fehler und weiteres obwohl ich den quelltext nur kopiert hatte. da hab ich es denn gleich sein gelassen.

ich habe mit den TTcpClient ---->TTcpServer schon eine verbindung hingekriegt klappt wunderbar
auf, den Client habe ich auf mb Blocking und den Server auf mbThreadBlocking.

ich finde bloß keine lösung für den umgekehrten weg, ich habe es schon mit einem timer im client versucht, einfach abzufragen ob was kommt, ich habe aber immer nur leere zeilen bekommen obwohl der server periodisch an den client was sendet.

es wäre schön das mit TTcpClient + TTcpServer hinzubekommen, da ich damit am weitesten gekommen bin :D

Schöne Grüße nach Schwerin vom Blumenhund :mrgreen:

jokerfacehro 21. Dez 2006 07:32

Re: TcpServer ----> TcpClient senden und empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier die neuste version meines tcp proggis

Aenogym 21. Dez 2006 07:35

Re: TcpServer ----> TcpClient senden und empfangen
 
also durch das OnAccept bekommst du ja den client als TCustomIpClient übergeben. den kannst du dir für spätere zwecke beispielsweise in einem array ablegen.
wenn du nun was vom server zum client senden willst, musst du lediglich TCustomIpClient.SendLn() aufrufen. am client wird dann OnReceive ausgelöst, welches dir mittels Buf und DataLen die Nachricht übergibt :)

im grunde ganz simpel. klappt bei mir tadellos.

edit: bei deinem server möchtest du schon im OnAccept den etxt empfangen. funktioniert bastimmt auch. aber besser ist es, auf das OnReceive des TCustomIpClient zu reagieren. denn da musst du nicht mit Receiveln() rumhantieren, sondern bekommst den text schon als pchar. und zwar jedesmal, wenn der client etwas gesendet hat.
und im client brauchst du beim empfang auch nciht ReceiveBuf() nutzen. da kommt dann nämlich etwas leeres raus. deine nachricht steht bei dem ereignis bereits im parameter buf. receivebuf() würde sich die nächste nachricht holen (die aber noch gar nciht geshcickt wurde -> also leer ;))

aeno

jokerfacehro 21. Dez 2006 07:47

Re: TcpServer ----> TcpClient senden und empfangen
 
:D :D :D

ich hab die ganze zeit per
Delphi-Quellcode:
TcpServer1.SendLn('string');
versucht was zu schick grrr ^^

jetz mit

Delphi-Quellcode:
ClientSocket.SendLn('string');
hab ich es vorhin ma ganz kurz geschafft das OnrecieveEvent auszulösen.
Aber der Text kam nicht an ^^
ich werde weiter rumprobieren und jetzt noch eine Frage
kann ich dem ClientSocket per Sendln etwas schicken wenn er gerade nicht connected hat ?
oder geht das denn immer nur im OnAccept Event?

jokerfacehro 21. Dez 2006 07:50

Re: TcpServer ----> TcpClient senden und empfangen
 
du meintest ja noch lieber auf Clientsocket.OnReceive reagieren als of OnAccept des Servers wie krieg ich das hin ? ^^

Aenogym 21. Dez 2006 07:55

Re: TcpServer ----> TcpClient senden und empfangen
 
Zitat:

Zitat von jokerfacehro
du meintest ja noch lieber auf Clientsocket.OnReceive reagieren als of OnAccept des Servers wie krieg ich das hin ? ^^

schreib dir zuerst eine funktion, die als eventhandler dient:

Delphi-Quellcode:
procedure TForm1.MyReceive(Sender: TObject; Buf: PChar;
  var DataLen: Integer);
begin
  //hier die nachricht ausesen (steck im parameter "Buf"; die länge steht in "DataLen")
end;
dann, beim OnAccept des TcpServer folgendes:

Delphi-Quellcode:
procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
begin
  //...
  ClientSocket.OnReceive := MyReceive;
  //...
end;
damit wird MyReceive aufgerufen, wenn bei dem server eine nachricht des clients ankommt ;)

aeno

jokerfacehro 21. Dez 2006 08:07

Re: TcpServer ----> TcpClient senden und empfangen
 
ich seh schon du hast ahnung ^^
das mit dem MyReceive klappt wunderbar, allerdings kann ich mit ReceiveLn leichter die bebfehle
herausfiltern ^^, da ich ja nicht nur text zum anzeigen senden will ;)

ich habe irgendwie noch nicht den wurm raus mit dem send vom server zum client, ich habe
beim OnAccept einfach mal zum schluss ClientSocket.SendLn('hallo'); reingeschrieben,
doch das OnReceive Event beim client wird nicht ausgelöst :/

jokerfacehro 21. Dez 2006 08:11

Re: TcpServer ----> TcpClient senden und empfangen
 
geil find ich auch, wenn ma im OnAccept des Servers vor dem ReceivLn also dem lesen der gesendeten Client Daten, SendLn macht sind die ganzen daten vom Client futsch xD

Edit: bzw. er liest unendlich viel leigt am endzeichen ^^

jokerfacehro 21. Dez 2006 09:04

Re: TcpServer ----> TcpClient senden und empfangen
 
hallo,
ich bin mit dem senden vom server zum client kein stück weiter.
irgendwie habe ich es vorhin einmal hingekriegt, dass das Onreceive Event vom Client ausgelöst wird.
doch ich kriege es nicht mehr hin.

ich sende vom client aus text per SendLn an den Server und warte danach perWaitForData(5000) auf Daten vom Server bevor ich die verbindung schließe.
Das OnAccept Event des Servers wird dann aufgerufen und ich führe darin bloß ClientSocket.SendLn('hallo'); aus.
und das ergebnis: Onreceive wird nicht ausgelöst im client argh :D

was mache ich flasch???? wenn ich was falsch mache :mrgreen:

Aenogym 21. Dez 2006 09:09

Re: TcpServer ----> TcpClient senden und empfangen
 
also ich sitz grad auf arbeit und kann daher leider nicht mal eben nachvollziehen ;)
prinzipiell solltest du alles richtig machen. am besten nochmal in der delphihilfe nachlesen und einfach ein bisschen rumprobieren :thumb:

aeno

jokerfacehro 21. Dez 2006 09:14

Re: TcpServer ----> TcpClient senden und empfangen
 
ich lasse das ganze per localhost auf einem rechner laufen, kann es sein dass es daran liegt ?

der client selbst hat die netzwerk ip-adresse: 10.10.10.34
der server hat 127.0.0.1

ich verbinde vom client natürlich zu 127.0.0.1 funktioniert auch,
kann es sein, dass der server nicht an die 10.10.10.34 senden kann?

ich hab das problem wenn ich dem server über IdIPWatch seine Ipadresse zuweise hat er natürlich 10.10.10.34, und vom client aus kann ich dann nicht auf 10.10.10.34 connecten.

keine ahnung warum


Edit: ich sollte das ganze mal mit 2 rechnern testen :mrgreen:

Aenogym 21. Dez 2006 09:18

Re: TcpServer ----> TcpClient senden und empfangen
 
also mit 127.0.0.1 sollte es keine probleme geben. habe ich damals auch erfolgreich auf einem rechner laufen gelassen :)

jokerfacehro 21. Dez 2006 09:21

Re: TcpServer ----> TcpClient senden und empfangen
 
hmmm ich werde wohl noch einige tage brauchen
:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

jokerfacehro 21. Dez 2006 09:29

Re: TcpServer ----> TcpClient senden und empfangen
 
wenn du lust hast, kannst du mir ja ein funktionierendes beispiel schicken :mrgreen:

PS: ich liebe Mr. Green :mrgreen: ^^

achja und James Thurbers Fabeln sind echt geil, besonders die eine moral:
Early to rise and early to bed makes a male healthy, wealthy and dead xD

jokerfacehro 21. Dez 2006 10:57

Re: TcpServer ----> TcpClient senden und empfangen
 
das ist ziemlich komisch:

wenn ich deine methode zum empfangen vom daten vom client nehme ohne was anderes in OnAccept etwa so
Delphi-Quellcode:
procedure TForm1.MyReceive(Sender: TObject; Buf: PChar; var DataLen: Integer);
begin
Memo1.Lines.Add(Buf);
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var s:string;
    i:integer;
    aa:boolean;
begin
Memo2.Lines.Add(ClientSocket.LocalHostAddr);
ClientSocket.OnReceive:=MyReceive;
end;
ausführe wird MyReceive garnicht ausgeführt :/

so klappt es:
Delphi-Quellcode:
procedure TForm1.MyReceive(Sender: TObject; Buf: PChar; var DataLen: Integer);
begin
Memo1.Lines.Add(Buf);
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var s:string;
    i:integer;
    aa:boolean;
begin
Memo2.Lines.Add(ClientSocket.LocalHostAddr);
ClientSocket.OnReceive:=MyReceive;
ClientSocket.ReceiveLn; ///////die wichtige zeile
end;
ich versteh' das nicht ganz ^^

am besten wäre wirklich ein beispiel ;)

jokerfacehro 21. Dez 2006 20:00

Re: TcpServer ----> TcpClient senden und empfangen
 
hmmm, ich habe weitergeforscht und sehe, dass es nur noch ein kleiner sprung ist :D :D :D

Es ist möglich ohne Timervom Client zu empfangen, ich muss bloß das OnReceive event im Client ausgelöst kriegen, wie hab ich das vorhin bloß hingekriegt argh ^^

ich hätte so gern ein beispiel, ich habe im 666diablo-forum genau den
richtigen beitrag gefunden, allerdings wurde kein code gepostet.

jokerfacehro 23. Dez 2006 14:33

Re: TcpServer ----> TcpClient senden und empfangen
 
falls mir jemand weiterhelfen kann bitte posten :mrgreen:

ich wünsche frohe Weihnachten und einen guten Rutsch :D :D :D

Trödel 24. Dez 2006 09:54

Re: TcpServer ----> TcpClient senden und empfangen
 
Mal über den Tellerrand schauen, dann kann fündig werden: Chat.

jokerfacehro 25. Dez 2006 11:04

Re: TcpServer ----> TcpClient senden und empfangen
 
hey, die seite habe ich mir vor 4 tagen schon angeschaut und
es funktioniert nicht, bei mir zumindest.
ich kriege nur synchronisationsfehler bei der demo.

falls jemand eigenerfahrung, die er mir mitteilen kann, hat, bitte posten :mrgreen:

ich habe mir auch schon die delphi 9 demo angechaut, doch die funktioniert bei mir auch nicht. der client friert beim connecten ein, wenn er leere
zeilen erhält, das liegt am timer keine ahnung warum.

das einzige chatprogramm, was bei mir funktioniert, ist die NetChat demo
direkt von delphi. allerdings ist die auf threads aufgebaut und
benutzt auf beiden seiten server und client, was für mich keine schöne Lösungdarstellt...

ich wünsche allen hier im forum eine frohe Weihnacht und täglich grüßt das Murmeltier XD

dominikkv 25. Dez 2006 13:08

Re: TcpServer ----> TcpClient senden und empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jokerfacehro
wenn du lust hast, kannst du mir ja ein funktionierendes beispiel schicken :mrgreen:

hmm...hab vor einer woche auch mal meinen ersten chat erstellt...
kannst ja mal schauen wie ich das gelöst hab
quelltext ist im anhang xD

ein paar befehle:

/cls: löscht den inhalt das chat-fensters
/auth pw: als admin identifizieren lassen (zB /auth Fisch)
/nick neuerNick: nick wechseln

nur als admin:
/rcon set +o Nick: Nick zum Admin machen
/rcon set +m Nick: Nick muten
/rcon set +k Nick: Nick kicken
-o, -m : rechte wieder nehmen

jokerfacehro 25. Dez 2006 13:17

Re: TcpServer ----> TcpClient senden und empfangen
 
hey, danke für die antwort, ich schau die nächsten tage mal rein :D

hier ist richtig Familienfest, deshalb habe ich gerade keine zeit ;)

so nebenbei, mit der Antifreeze komponente von indy habe ich es geschafft,
den indy chat demo 9 client zum laufen zu bringen, allderings gibt'S da immer noch eienige lustige fehler naja :mrgreen:

Frohes Fest :D :D :D

jokerfacehro 25. Dez 2006 14:01

Re: TcpServer ----> TcpClient senden und empfangen
 
das is en schönes Weihnachtsgeschenk xD

ich habe mir dein Quelltext doch mal kurz angeschaut.
da ich eine andere Delphi version habe ist bei mir TServerSocket nicht
direkt vorhanden.

deshalb muss ich ServerSocket1 wo anders deklariren nämlich hier:

Delphi-Quellcode:
public
ServerSocket1:TServerSocket;
denn kann ich dein proggi auch compilieren und es funktioniert.
schönes chat-programm :D

jokerfacehro 27. Dez 2006 18:09

Re: TcpServer ----> TcpClient senden und empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
sooooooo ^^

ich habe mich jetzt auch mit TServerSocket probiert und
das ergebnis kann sich jetzt schon sehen lassen ^^

mein erster chat: ich habe ihn übers internet getestet,
funktioniert auch mit router wunderbar wenn man den port weiterleitet ;)

jokerfacehro 28. Dez 2006 03:24

Re: TcpServer ----> TcpClient senden und empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle miteinander,

dies ist die neueste Version meines Chats :D

Das beste an dieser Version ist, sie trägt alle ChatServer auf einem MasterServer zusammen.
Jetzt bekommt jeder Client immer eine Serverliste mit allen gerade laufenden Servern.

Man brauch nur noch den Server auswählen fertig :mrgreen:
das habe ich mit einer php datei auf meinem webspace und dem WebBrowser im Proggi erledigt.

der server fragt von da seine WAN IP adresse ab, wenn das proggi startet.
wenn er dann connected, wird seine ip zu der serverliste hinzugefügt,
wer dann disconnected wird sie wieder entfernt

dann muss der client nur mal die holen
hier ist die abfrage der serverliste für den client:
http://mitglied.lycos.de/jokerfacehr...on=get_servers

wenn man die gleiche seite öfter aufruft und man will sie neuladen einfach hinten ein
Delphi-Quellcode:
URL+'&time='+TimeToStr(now);
ranhängen, da jetzt neue parameter vorhanden sind.
ansonsten lädt er die seite aus dem cache ;)

Zusätzlich wird die Verzögerungszeit mit angezeigt.

großen Dank an DominikKV :D
ich habe viel von deinem Beispiel Chat lernen können

so nun viel Spaß damit.

jokerfacehro 3. Jan 2007 14:08

Re: TcpServer ----> TcpClient senden und empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier ist du die neuste version
mit admin authorisierung, natürlich admin commands und en spamschutz ^^

:D :D :D :D :D

jokerfacehro 8. Jan 2007 15:02

Re: TcpServer ----> TcpClient senden und empfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey ich bin es wieder :D

hier ist die neueste Version, ich zähl ma alles auf was man da so machen kann als client:

- serverliste aller chatserver abfragen
- blinken in der taskleiste bei neuen infos
- alle comamnds abfrage mit /cmd all
- nick ändern per command (/nick name)
- authentifizieren per command (/auth password)
- personal message per command (/pm name message)
- als admin :
> andere user status zu admin(alle rechte,
user(kann sich als admin authentifizeiren) oder trial(hat keien rechte) setzen
> muten/unmuten von usern
> kicken von usern
- speichern von port,server und name für die faulen xD
- kleine bildchen weils schöner ist :mrgreen:

und ganz wichtig antispam funktion

server:
hat alle adminrechte kann jederzeit das rcon password zum authentifizieren ändern
und hat zusätzlich den befehl kick all ^^

Goldesel 8. Jan 2007 15:52

Re: TcpServer ----> TcpClient senden und empfangen
 
Moin,

ich denke, es ist besser wenn du dein Programm in die Freeware- Sparte stellst. Und noch ein kleiner Tipp: Man kann Beiträge nauch editieren ;-) ...

jokerfacehro 8. Jan 2007 16:03

Re: TcpServer ----> TcpClient senden und empfangen
 
jepp ich weiß xD

aber denn wird der thread nicht gepusht xD

ich seh grad man kann nur noch innerhalb von 24 stunden eienn beitrag editieren also geht'S garnicht anders ^^

hier ist der link zu meinem freeware link :D
http://www.delphipraxis.net/internal...t.php?t=100386

jokerfacehro 17. Jan 2007 22:07

Re: TcpServer ----> TcpClient senden und empfangen
 
hier ist mein webspace, wo ihr den client + server runterladen könnt ;)

langsam kann sich das proggi sehen lassen :mrgreen:

http://blumenhund.afischi.de/download/

jokerfacehro 8. Feb 2007 19:44

Re: TcpServer ----> TcpClient senden und empfangen
 
so so so :D

ich habe eine neue version draußen,
man kann die farben einstellen,
verbindungstechnische fehler sind behoben und
man kann die sprache ändern, wobei der deutsche titel noch nicht festgelegt ist :D

zudem habe ich eine hilfe mit bei schautS' euch ma an :)

der Jokerface

der Client
http://blumenhund.afischi.de/download/ChatClient.rar

der Server
http://blumenhund.afischi.de/download/ChatServer.rar

Johannes.Leupold 16. Mai 2011 18:15

AW: TcpServer ----> TcpClient senden und empfangen
 
Hi,

ich versuche mich auch gerade am TCP/IP-Datenaustausch mit TTcpServer und TTcpCLient.

Ich habe auch alle Ratschläge hier befolgt, aber bei mir wird bei TCustomIpClient.SendLn('string') nicht das Ereignis OnReceive beim Client ausgelöst.
Delphi-Quellcode:
procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
...
ClientSocket.Sendln('Test');
end;
Delphi-Quellcode:
procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin
  Memo2.Lines.Add('Test');
end;
Diese Testausgabe erscheint nicht. Was hab ich falsch gemacht? :?

rollstuhlfahrer 16. Mai 2011 18:39

AW: TcpServer ----> TcpClient senden und empfangen
 
Ich würde mal auf die Firewall tippen, sodass gar keine Verbindung entsteht.
Andernfalls würde ich den Umstieg auf die Indy-Komponenten vorschlagen, da ich mit diesen gute Erfahrungen gemacht habe.

Bernhard

Johannes.Leupold 25. Mai 2011 19:47

AW: TcpServer ----> TcpClient senden und empfangen
 
Die Verbindung kommt zustande, denn der Server emüfängt Daten vum Client, aber beim Client kommen keine vom Server an...

Die Firewall blockt das Programm nach einigen Einstellungen nicht mehr.

Und ich bekomme immer den Socket Error 10054 (Connection reset by peer).

Weiß irgendjemand Rat? :?:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz