![]() |
"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 |
Re: "Rückkanal" Bei Client/Server Anwendung
hi,
verrate uns doch bitte, welche komponente du benutzt ;) die indys, sockets oder was? Aenogym |
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. |
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. |
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? |
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 |
Re: "Rückkanal" Bei Client/Server Anwendung
@Cras339: Stimmt nicht was du schreibst.
mit
Delphi-Quellcode:
kommt man an die Verbindungen zu den einzelnen Clients. Wenn also
ServerSocket1.Socket.Connections[i]
Delphi-Quellcode:
größer 0 ist kann man mit
ServerSocket1.Socket.ActiveConnections
Delphi-Quellcode:
auch Text zurück an den Client senden. Wenn nur ein Client verbunden ist kann man also mit
ServerSocket1.Socket.Connections[i].SendText
Delphi-Quellcode:
den Text "Hallo" an den Client schicken.
ServerSocket1.Socket.Connections[0].SendText('Hallo');
|
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! |
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?!
|
Re: "Rückkanal" Bei Client/Server Anwendung
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz