Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi "Rückkanal" Bei Client/Server Anwendung (https://www.delphipraxis.net/41647-rueckkanal-bei-client-server-anwendung.html)

Aljoscha 6. Mär 2005 13:05


"Rückkanal" Bei Client/Server Anwendung
 
Hi.
Ich hab hier eine vielleicht etwas dumme Frage, aber ich komme nicht weiter.
Ich habe ein kleines Chatprogramm.
Das ganze sieht so aus das es einen Client und einen Server gibt.
Nun kann ich mit dem Client an den Server senden, aber geht das ganze auch umgekehrt?
Das der Server an den Client schreibt?
Oder muss ich in jedes der programme einen Client und einen Server eibauen?
Wäre nett wenn jemand ein Codebeispiel hätte.
Und wo ich grad dabei bin ^^.
Gibt es bei der Standart Server/ Client Komponente auch Threats und wie kann ich damit umgehen?
Auch hier wäre ein beispielcode nützlich.

Ich hoffe ihr könnt mir helfen. =D

Aenogym 6. Mär 2005 13:16

Re: "Rückkanal" Bei Client/Server Anwendung
 
hi,

verrate uns doch bitte, welche komponente du benutzt ;)
die indys, sockets oder was?

Aenogym

RJelinek 6. Mär 2005 14:01

Re: "Rückkanal" Bei Client/Server Anwendung
 
Lösung bei Verwendung von Indy:

1.) Vorausgesetzt, du verwendest TCP
Auf einer Seite die IdTCPServer-Komponente, auf der anderen brauchst du eine IdTCPClient-Komponente. Nach dem Verbindungsaufbau des Clients zum Server mit Connect bekommst du über das OnConnect-Event eine IdPeerThread (die ich jetzt mal IPT nenne). Mit dieser hast du die Möglichkeit zu Senden und zu Empfangen über die Routinen IPT.Connection.Readxxx und IPT.Connection.Writexxx. Auf der Clientseite hast du per Default Readxxx und Writexxx-Routinen über die IdTCPClient-Komponente. Da eine TCP-Verbindung bidirektional funktioniert (du kannst also auf beiden Seiten sowohl Senden als auch Empfangen), ist deine Aufgabe recht leicht gemacht ...

2.) Vorausgesetzt, du verwendest UDP
Auf beiden Seiten die IdUDPServer-Komponente verwenden. Die IdUDPServer-Komponente hat ein OnRead-Ereignis und Senderoutinen. Du brauchst also keine Threads (außer das Senden funktioniert bei dir auch Thread-gestützt.)

Lösung zu Threads:
1.) Bei UDP:
Die Komponenten bieten keine Threads, aber da du Callbacks über die OnRead-Ereignisse hast, brauchst du die bei halbwegs eleganter Programmierung auch nicht.

2.) Bei TCP:
Bis jetzt habe ich auf beiden Seiten einen normalen Thread gestartet, der sowohl Senden, als auch Empfangen übernimmt. Beim Empfangen musst du allerdings allerdings unterscheiden, ob du blockierend (also warten bis Zeichen da sind) oder nicht-blockierend arbeiten willst. Beim nicht-blockierenden Verhalten rufst du zuerst XX.ReadFromStack(true,0,false) auf und danach steht in XX.InputBuffer.Size die Anzahl an empfangen Zeichen zur Verfügung (wenn da 0 drinnsteht, dann keine Read-Routine aufrufen, da du sonst blockierst).

Bei der IdTCP-Serverkomponente glaube ich gäbe es die Möglichkeit den IdPeerThread zu verwenden. Dieser ruft das OnExecute-Ereigbnis der Serverkomponente auf, die als Thread beim Server verwendet werden könnte.

Wenn du aber auf beiden Seiten einen Thread brauchst, dann empfiehlt es sich, diesen nicht zu verwenden, da du ansonsten zwei unterschiedliche Quellcodes für Sender und Empfänger hast. Meine manuell angelegten Threads kann ich aber auch beiden Seiten mit identischem Quellcode verwenden.

Aljoscha 6. Mär 2005 14:15

Re: "Rückkanal" Bei Client/Server Anwendung
 
Ich verwende die "normale" ClientSocket / ServerSocket Komponente die bei Delphi 5 dabei war, unter dem Menüpunkt Internet :)

Hoffe ihr könnt damit was anfangen.

Aljoscha 6. Mär 2005 15:08

Re: "Rückkanal" Bei Client/Server Anwendung
 
Also vielleicht ist nicht ganz klar was ich meine.

Ich sende per:
ClientSocket1.Socket.SendText('Testsring-Client')

Das klappt wunderbar.

Nun will ich umgekehrt etwas an den Client vom Server aus senden:
ServerSocket1.Socket.SendText('Testsring-Server')

Dann erscheint eine Fehlermeldung:

In Server.exe ist eine Exeption der klasse ESocketError aufgetreten.
Meldung: 'Windows-Socket-Fehler: Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (...) keine Adresse angegeben wurde (10057)

Weiß jemand weiter?

Cras339 6. Mär 2005 15:43

Re: "Rückkanal" Bei Client/Server Anwendung
 
Hallo!

Du brauchst auf beiden Formularen auch beide Komponenten (TServerSocket und TClientSocket)! Dann kannst du auch Nachrichten zurücksenden!

Ich meine so müsste es funktionieren hab es mal an Hand eines Beispielchats für C++ gesehen.

Gruß

Tim

SirThornberry 6. Mär 2005 15:51

Re: "Rückkanal" Bei Client/Server Anwendung
 
@Cras339: Stimmt nicht was du schreibst.
mit
Delphi-Quellcode:
ServerSocket1.Socket.Connections[i]
kommt man an die Verbindungen zu den einzelnen Clients. Wenn also
Delphi-Quellcode:
ServerSocket1.Socket.ActiveConnections
größer 0 ist kann man mit
Delphi-Quellcode:
ServerSocket1.Socket.Connections[i].SendText
auch Text zurück an den Client senden. Wenn nur ein Client verbunden ist kann man also mit
Delphi-Quellcode:
ServerSocket1.Socket.Connections[0].SendText('Hallo');
den Text "Hallo" an den Client schicken.

Cras339 6. Mär 2005 16:05

Re: "Rückkanal" Bei Client/Server Anwendung
 
Ich habe gerad noch mal ein Beispiel für einen Chat, das bei meiner Delphi-Version dabei war gefunden. Da ist es auch mit beiden Komponenten gelöst worden!

Ich würde es auch anhängen aber das ist rechtlich bestimmt nicht gestattet!

SirThornberry 6. Mär 2005 16:08

Re: "Rückkanal" Bei Client/Server Anwendung
 
es verbietet ja auch keiner mit beiden Komponenten zu lösen, aber es ist eben überflüssig da die Verbindunge zwischen Server und Client schon besteht, wozu dann noch eine zweite verbindung herstellen wenn man auch über die bestehende Verbindunge in beiden Richtungen Senden/empfangen kann?!

PierreB 6. Mär 2005 16:54

Re: "Rückkanal" Bei Client/Server Anwendung
 
Wenn du Daten vom Server an Clienten schicken willst, guck ma in die Suche und du wirst fündig. ;)
Zum Beispiel hier:
Klick
Klick I


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.
Seite 1 von 2  1 2      

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