000
06.05.2002, 21:31
snoopdog
|
nAbend ich versuche grade nen Client/Server Programm zu machen nur leider scheitert es schon beim senden von daten. Also er tut sich verbinden nur dann kommt ne Fehlermeldung beim Senden von Socket blabla, die is ganz schön lang.
Naja hier mal der code vom senden vom Client und vom Server
Server
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket); var text:string; begin text:=ss.Socket.ReceiveText; ss.Socket.SendText('hallo'); end;
und vom Client
procedure TForm1.Button1Click(Sender: TObject); begin cs.Socket.SendText('na du') end;
procedure TForm1.csConnect(Sender: TObject; Socket: TCustomWinSocket);Var test:String; begin label1.Caption:='verbunden'; end;
procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket); var test:string; begin test:=cs.Socket.ReceiveText; ShowMessage(test); end;
könnt ihr mir helfen???
--
Visit our 500er Gamer Lan @ www.evil-lanparty.de or @ www.evil-havoc.com Visit the HaVoc Lanparty Community @ www.havoc-lanparty.com
|
|
Profil || Suche
|
001
06.05.2002, 21:57
Onkel Dittmeyer
|
Ja, was sagt er denn? Machn Screenshot oder was...
--
|
|
Profil || Suche
|
002
06.05.2002, 22:01
snoopdog
|
hmm ok ich schreibe mal alles hin
also einmal asyncroner socketfehler beim client
udn beim server Widnows Socket Fehler: Eine Anforderung zum Senden und empfangen wurde verhindert, da der socket nicht verbunden ist. Aber beim client hab ich nen Label gemacht wenn der verbindet soll der den auf verbindunen setzen udn das amcht der auch
--
Visit our 500er Gamer Lan @ www.evil-lanparty.de or @ www.evil-havoc.com Visit the HaVoc Lanparty Community @ www.havoc-lanparty.com
|
|
Profil || Suche
|
003
06.05.2002, 22:18
Retro
|
Du musst den Server sowie den Clientsocket vor der Benutzung initialisieren und connecten...
III. TClient/TServer - Socket ~~~~~~~~~~~~~~~~~~~~~~~~ Bei diesen Komponenten handelt es sich um simple TCP/IP Bausteine. Die TClientSocket dient zum Aufbau einer Verbindung und kann wie die TServerSocket Daten empfangen und verschicken. Diese Komponenten bieten eine einfache Handhabung des TCP/IP Protokolls wie z.B. die Ermittlung der IP des Remote Hosts.
3.1 Aufbau einer Verbindung ~~~~~~~~~~~~~~~~~~~~~~~ Eine Verbindung mit der TClientSocket herzustellen ist sehr einfach, solange sie nur den Host ansprechen wollen, und die Verbindung nicht über einen Proxy laufen lassen. Für das Beispiel nenne ich jetzt die ClientSocket 'cs' und die ServerSocket 'ss'.
cs.Port:=80; // Festlegung des Ports cs.Host:=127.0.0.1; // IP des Zielrechners cs.Active:=true; // Aufbau der Verbindung
Der Port der ClientSocket muss IMMER ein Integer bzw. LongInt sein. Denken sie daran, dass zuerst der Host und der Port definiert werden muss, bevor sie die Verbindung aufbauen. Nach dem selben Schema läuft es auch bei der ServerSocket ab.
ss.Port:=80; // Festlegung des Ports ss.Active:=true; // Aktivierung der ServerSocket
Wie sie jetzt sehen, wurde keine IP definiert. Das liegt daran, weil die ServerSocket wie nach dem Namen ein Server ist. d.h. sie wartet auf Verbindungen.
3.2 Senden und Empfangen ~~~~~~~~~~~~~~~~~~~~ Für den Verkehr zwischen ServerSocket und ClientSocket, greifen wir jetzt auf "Plain Text" zurück d.h. es wird nur Text versendet. Hier wird jetzt der Client dem Server den Text 'PING' senden. Der Server wird den empfangenen Text kontrollieren und darauf antworten. Dabei kontrolliert der Client zuerst, ob eine Verbindung besteht. Natürlich muss der Client auch den Text ausgeben, den der Server als Antwort sendet.
Client ~~~~~~
procedure TForm1.Button1Click(Sender: TObject); begin if cs.Socket.Connected=true then // wenn Verbindung besteht, cs.Socket.SendText('PING'); // dann sende 'PING' end;
procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket); var rec:String; begin rec:=socket.ReceiveText; // der empfangene Text wird in die Variable 'rec' geschrieben Memo1.Lines.Add(rec); // Ausgabe der Variable 'rec' end;
Server ~~~~~~ procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket); var rec:String; Begin rec:=Socket.ReceiveText; if (rec='PING') then Socket.SendText('PONG'); end;
Dieses Beispiel lässt sich nur durch den programmierten Client ansprechen und NICHT durch Telnet, da Telnet jedes Zeichen direkt sendet und dadurch wird der Server jedes Zeichen interpretieren.
--
shielding people from their own stupidity is an evolutionary step backwards anyway.
/* God is dead!............Nietzsche */ /* Nietzsche is dead!......God */ /* Nietzsche is God!.......The Dead */
|
|
Profil || Suche
|
004
06.05.2002, 22:59
feigling
|
Naja, man kanns auch leichter ausdrücken =) Einfach im Objektinspektor bei ServerSocket active von false auf true stellen. Kannst es natürlich auch im Objektinspektor auf false lassen und es irgendwo im Code auf true setzen. Jedenfalls muss das an sein, damit der Server läuft :) Außerdem musst du den Port noch einstellen. Nimm einfach bei Server und Client Socket die gleiche Zahl.
Beim Clientprogramm gibst du das in den Programmcode ein (oder im Objektinspektor umstellen) :
ClientSocket.host := '127.0.0.1'; // localhost ClientSocket.port := 1234; // Zahl, die auch beim Serversocket steht ClientSocket.active := true;
Müsste dann eigentlich klappen, wenn ich nichts vergessen habe =)
--
Dieser Beitrag wurde am 06.05.2002 um 23:00 von feigling bearbeitet.
|
|
Profil || Suche
|
005
07.05.2002, 14:02
snoopdog
|
natürlich hab ich den Client/ServerSocket.Active auf true gesetzt.
Nur es geht ja net..... die funktion beim Server ServerSocket.ClientRead ist das die nachrichten schelife um alles zu empfangen was vom Client kommt??
und beim Server die Funktion Client.Read für die Nachrichten die vom Server kommen???
oder brauch ich da andere Funktionen??
--
Visit our 500er Gamer Lan @ www.evil-lanparty.de or @ www.evil-havoc.com Visit the HaVoc Lanparty Community @ www.havoc-lanparty.com
|
|
Profil || Suche
|
006
07.05.2002, 14:45
feigling
|
ja und ja, diese Funktionen sind dafür zuständig.
hast du auch das eingestellt ?
ClientSocket.host := '127.0.0.1'; // localhost ClientSocket.port := 1234; // Zahl, die auch beim Serversocket steht ClientSocket.active := true;
Wenn ja, dann poste mal den ganzen Code deiner Programme hier rein.
€dit: Ich hab hier noch zwei Programme, Server und Client, was ich mal gemacht habe (is zwar noch nicht fertig, aber ...=). Guck dir den Code einfach mal an und vergleiche die wichtigen Stellen mit deinen. Vielleicht entdeckst du ja deinen Fehler. ich hätte dir zwar auch mal eben so ein Beispiel machen können, aber ich hab leider keiner Zeit. kannst ja mal gucken, ob du deinen Fehler beim Vergleichen entdeckst. Wenn nicht, mach ich dir heute abend noch ein Beispielprogramm, wo nicht so viel Kram im Code ist, der mit deinem Problem eigentlich nix zu tun hat.
Hier der Source : http://mitglied.lycos.de/feigling4u/source.zip
--
Dieser Beitrag wurde am 07.05.2002 um 14:59 von feigling bearbeitet.
|
|
Profil || Suche
|
007
07.05.2002, 18:10
snoopdog
|
also ich hab die drei Zeilen nicht im code eingestellt sondern in diesem Object dingens bei mir auf der rechten Seite wo man son ganzen kram einstellen kann. Naja hier der gesammte code vom Server
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp;
type TForm1 = class(TForm) ss: TServerSocket; procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket); var text:string; begin text:=ss.Socket.ReceiveText; ss.Socket.SendText('hallo'); end;
end.
und der Client
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls;
type TForm1 = class(TForm) cs: TClientSocket; Button1: TButton; label1: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure csConnect(Sender: TObject; Socket: TCustomWinSocket); procedure csRead(Sender: TObject; Socket: TCustomWinSocket); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin cs.Port:=1008; cs.Host:='127.0.0.1'; cs.Active:=true; end;
procedure TForm1.Button1Click(Sender: TObject); begin cs.Socket.SendText('na du') end;
procedure TForm1.csConnect(Sender: TObject; Socket: TCustomWinSocket);Var test:String; begin label1.Caption:='verbunden'; end;
procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket); var test:string; begin test:=cs.Socket.ReceiveText; ShowMessage(test); end;
end.
kannst ja mal durchsehen
--
Visit our 500er Gamer Lan @ www.evil-lanparty.de or @ www.evil-havoc.com Visit the HaVoc Lanparty Community @ www.havoc-lanparty.com
|
|
Profil || Suche
|
008
07.05.2002, 18:22
feigling
|
Hab den Fehler gefunden :)
Wenn du mit dem Server etwas an den Client senden willst, musst du es so machen:
var j : integer; begin for j := 0 to ServerSocket1.Socket.ActiveConnections -1 do begin ServerSocket1.Socket.Connections[j].SendText('Hallo Client.'); end;
oder wenn es nur ein Client sein soll so:
ServerSocket1.Socket.Connections[0].SendText('Hallo Client.');
Hier nochmal der Code davon: http://mitglied.lycos.de/feigling4u/source.zip
--
Dieser Beitrag wurde am 07.05.2002 um 18:44 von feigling bearbeitet.
|
|
Profil || Suche
|