![]() |
Re: ServerSocket1ClientRead
Hallo Delphi Freunde!
Bin grad dabei, mich mit WinSockets zu besch„ftigen. IN DSDT gibt es dazu ein Handbuch und ein Programmbeispiel. Das habe ich mir runtergeladen, um jetzt damit experimentieren zu können. Leider habe ich ein Problem, das ich selber nicht so schnell lösen kann. Hier zuerst der Quelltext:
Delphi-Quellcode:
Wenn ich das Ereignis Senden auslöse <btnSendClick>, will ich den gesendeten Text im Memo sehen.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls; type TForm1 = class(TForm) btnStart: TButton; btnStop: TButton; btnSend: TButton; Edit1: TEdit; Memo1: TMemo; procedure btnStartClick(Sender: TObject); procedure btnStopClick(Sender: TObject); procedure btnSendClick(Sender: TObject); procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } Client: TClientSocket; Server: TServerSocket; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnStartClick(Sender: TObject); begin Server.Port:=44044; Client.Port:=44044; Client.Host:='127.0.0.1'; //Localhost Server.Open; Client.Open; end; procedure TForm1.btnStopClick(Sender: TObject); begin Client.Close; Server.Close; end; procedure TForm1.btnSendClick(Sender: TObject); begin if Client.Active = true then begin Client.Socket.SendText(Edit1.Text); Edit1.Text:=''; ServerClientRead(Sender,Client); end; end; procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add(Socket.ReceiveText); end; procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('***Connected.') end; procedure TForm1.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add('***Disconnected.'); end; procedure TForm1.FormCreate(Sender: TObject); begin Client := TClientSocket.Create(self); Server := TServerSocket.Create(self); end; procedure TForm1.FormDestroy(Sender: TObject); begin Client.Free; Server.Free; end; end. Warum ist in diser Methode der Aufruf von ServerClientRead() so wie oben nicht richtig? Wenn ich btnSend anklicke, erhalte ich eine EAccessViolation. Muss ich vielleicht noch eine Connect-Methode aufrufen, die im Beispiel nicht erwähnt, aber in den Tiefen der Socket-Klasse verborgen ist? DelphiSourcer |
Re: ServerSocket1ClientRead
hast du dir den Quelltext nur kopiert oder die Methoden richtig angelegt und zugewiesen? An welcher Adresse kommt deine AV?
|
Re: ServerSocket1ClientRead
1. Der Aufruf von ServerClientRead() sollte so lauten:
Delphi-Quellcode:
2. Dieser Aufruf bringt aber nicht das gewünschte Ergebnis, weil afaik kann man aus dem Client Socket das eben gesendete nicht mit ReceiveText wieder heraus lesen (was ja innerhalb vom ServerClientread() getan wird), sondern ReceiveText liest nur alles empfangene wieder aus.
ServerClientRead(Sender, Client.Socket);
3. Wie SirThornberry schon erwähnte: alles zugewiesen im Objektinspektor? |
Re: ServerSocket1ClientRead
Hallo!
Zitat:
Netzwerkprogrammierung verfüge und erst mal ein funktionierendes Grundgerüst haben will, an dem ich alles weitere erlernen kann. Ich habe vorausgesetzt, das das Beispiel erst mal funzt. Macht es aber nicht! Wenn ich die Methode ServerClientRead() zur Übernahme des Textes aus Edit1 in Memo1 in btnSendClick weglasse, wird im Memo gar nix angezeigt. Und wenn ich sie aufrufe, kriege ich die Exception! Leider ist das zugehörige Tutorial diesbezüglich sehr knapp gehalten. Ich brauche wohl eines, das beim Urschleim anfängt. Irgendwas wird hier an Kenntnis vorausgesetzt, was ich noch nicht kann. An Delphi liegt es nicht, da hab ich genug Erfahrung. Es liegt an der Programmierung der Socket-Komponenten, die ich noch nicht beherrsche, weshalb ich ja auch hier anfrage! Netzwerkprogrammierung muss doch spätestens seit Turbo Delphi nicht mehr Spezialisten vorbehalten bleiben. [OT] Bin in Hartz IV und brauche daeshal dringend nen Job. Warum nicht programmieren in der Zeit, in der ich jetzt nix zu tun habe. Ich brauche das Geld. Und ich habe den Thread "Agenda 2010 - Menschenrechtsverletzung?" damals verfolgt. Und ich gehöre besimmt nicht zu denen, die einfach nur zu faul zum Arbeiten sind, wie der Grundtenor dieses Threads, zumindest von der Mehrheit der Diskutanten aussagt. Aber um kommerziell programmieren zu können, muss ich wohl oder übel Netzwerkprogrammierung beherrschen, wenigstens, wenn ich die mir zur Verfügung stehenden Auftraggeber bedienen will. [/OT] DelphiSourcer |
Re: ServerSocket1ClientRead
Zitat:
Die Routinen können eigentlich nur dann eine AV verursachen, wenn die Instanzen von TServerSocket und TClientSocket (also die Klassenvariable Client und Server) nicht erstellt wurden und somit Client = Nil ist und Server genauso. Und dass bedeutet, dass der Form deines Projektes wahrscheinlich im Objektinspektor beim OnCreate nicht das FormCreate eingetragen wurde und im OnDestroy nicht das FormDestroy. Dieses könntest du im Objektinspektor nachschauen (und genau darauf wollte ich mit meinem 3. Punkt hinaus, somit meinte SirThomberry das gleiche). Und ich wette hier einfach mal frecherweise um einen Smiley, dass genau dies nicht gemacht wurde und genau dies nicht überprüft wurde. Folgendes gilt, wenn ich den Smiley verloren habe: Wenn du mit Delphi Erfahrung hast, sollten solche Dinge keine Hürde darstellen. Dann sollte der Umgang mit dem Debugger wenigstens grundlegend beherrscht werden und genauso der Umgang mit der IDE (hier vor allem Objekt Inspektor). Da nützt es nichts so eine OT Erklärung hier zu schreiben, weil das interessiert nicht. Es geht um das programmieren und da helfen wir gerne - egal ob Hartz IV, Festangestellter oder Freischaffend. Das ist unerheblich und tut nix zur Sache und hat nix damit zu tun wie hier einem geholfen wird. |
Re: ServerSocket1ClientRead
@ delphisourcer
Du kannst eine Ereignisprozedur nicht selbst aufrufen, sondern must sie als solche definieren. Dein Beispiel funktioniert, wenn du folgendes änderst (habe ich getestet):
Delphi-Quellcode:
grüsse,
procedure TForm1.btnSendClick(Sender: TObject);
begin if Client.Active = true then begin Client.Socket.SendText(Edit1.Text); Edit1.Text:=''; // ServerClientRead(Sender,Client); Das ist sinnlos und zu entfernen end; end; procedure TForm1.FormCreate(Sender: TObject); begin Client := TClientSocket.Create(self); Server := TServerSocket.Create(self); server.OnClientRead:=serverclientread; // so wird servercientread als die onread ereignisprozedur definiert end; der flossinger |
Re: ServerSocket1ClientRead
Hallo flossinger!
Danke Dir, Das war der entscheidende Tipp. Habe die Zeile mit OnClintRead := ServerClientRead() in FormCreate ergänzt und erhalte das gewünschte Ergebnis. Schönen Abend noch wünscht DelphiSourcer |
Re: ServerSocket1ClientRead
Zitat:
Mit anderen Worten, du hast nicht alle Ereignisse im Objektinspektor zugewiesen/überprüft. :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:53 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