Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
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
Quellcode:
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var text:string;
begin
text:=ss.Socket.ReceiveText;
ss.Socket.SendText('hallo');
end;

und vom Client

Quellcode:
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

zum Seitenanfang zum Seitenende Profil || Suche
001
06.05.2002, 21:57
Onkel Dittmeyer



Ja, was sagt er denn? Machn Screenshot oder was...

--

zum Seitenanfang zum Seitenende 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

zum Seitenanfang zum Seitenende Profil || Suche
003
06.05.2002, 22:18
Retro



Du musst den Server sowie den Clientsocket vor der Benutzung initialisieren und connecten...

Zitat:
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 */

zum Seitenanfang zum Seitenende 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) :

Quellcode:
  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.
zum Seitenanfang zum Seitenende 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

zum Seitenanfang zum Seitenende Profil || Suche
006
07.05.2002, 14:45
feigling



ja und ja, diese Funktionen sind dafür zuständig.

hast du auch das eingestellt ?

Quellcode:
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.
zum Seitenanfang zum Seitenende 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
Quellcode:
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

Quellcode:
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

zum Seitenanfang zum Seitenende 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:

Quellcode:
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:

Quellcode:
  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.
zum Seitenanfang zum Seitenende Profil || Suche