Autor Beitrag
elron
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

WIN XP
D5 Standard
BeitragVerfasst: So 11.09.05 12:47 
Also, ich hab erst grade angefangen mit Delphi zu programmieren, deshalb wollte ich mal was fragen:
Ich habe versucht, einen sehr simplen einseitigen Chat zu realisieren, dazu habe ich folgendes verwendet:
Client:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ClientSocket1: TClientSocket;
    procedure Button1Click(Sender: TObject);
//[...]
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active := true; //aktiviert den Socket
ClientSocket1.Socket.Sendtext(Edit1.Text); //sendet den Text
end;

Server:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TServer = class(TForm)
    ServerSocket1: TServerSocket;
    Memo1: TMemo;
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
//[...]
procedure TServer.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   s := Socket.ReceiveText; //empfängt den text und schreibt ihn in s
  Memo1.Lines.add(s); //schreibt s in das Memo
end;


Nur habe ich das Problem, dass wenn ich versuche, etwas zu senden, das erst beim zweiten Mal senden ankommt.
Harry M.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754

Win 2000, XP
D2005
BeitragVerfasst: So 11.09.05 12:55 
:welcome: im DF!!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);  
begin  
ClientSocket1.Host := 127.0.0.1
ClientSocket1.Port := 99
ClientSocket1.Open;

// U.U. hier warten bis verbunden oder Connecterror auf getreten ist !!!!
// Das mache ich immer über eine globale Var im ClientError-Ereigins
// den Text zum Senden würde ich zum ausprobieren deshalb immer erstmal
// in das Connect-Ereigis packen ;-)
ClientSocket1.Socket.Sendtext(Edit1.Text); //sendet den Text  
end;

_________________
Gruß Harry
Et spes me per dies sine te ducat et amor me ferat, si dolor spem tollit.
elron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

WIN XP
D5 Standard
BeitragVerfasst: So 11.09.05 13:10 
habs fast hingekriegt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
ClientSocket1.Socket.Sendtext(Edit1.Text);
ClientSocket1.Close;
end;

und
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host := '127.0.0.1';
ClientSocket1.Port := 99;
ClientSocket1.Open;
end;

nur weiß ich nicht, womit man abfragen kann, ob der verbunden ist, geht das vl. über "if ClientSocket1.Open = true" oder "if ClientSocket1.Connected = true" oder wodrüber?
ach ja, und nochmal danke!
Harry M.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754

Win 2000, XP
D2005
BeitragVerfasst: So 11.09.05 13:35 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
public
    { Public-Deklarationen } 
    ConnectError: Boolean;
    end;

procedure Delay(dwMilliseconds: Longint);
var
  iStart, iStop: DWORD;
begin
  iStart := GetTickCount;
  repeat
    iStop := GetTickCount;
    Application.ProcessMessages;
  until
    (iStop - iStart) >= dwMilliseconds;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  ConnectError := ErrorCode <> 0;

  // Ggf über SysErrorMessage(ErrorCode) den Fehler ausgeben lassen wenn nötig 
  ErrorCode := 0// und 0 setzten um keine Fehler auszugeben! 
end;

procedure TForm1.Button1Click(Sender: TObject);    
begin    
ClientSocket1.Host := 127.0.0.1;   
ClientSocket1.Port := 99;   
ClientSocket1.Open;  
 
// Schleife ggf in Thraed starten
while (ClientSocket1.Socket.Connected = FALSE) and (ConnectError = FALSE) do Delay(10);

// wenn Du mehrmals senden willst wird bei Dir immer neu connectet ;-) !!!!
// und dann die Abfrage
if ConnectError then ClientSocket1.Socket.Sendtext(Edit1.Text); //sendet den Text    
  else showmessage('Geht nich :-(');

// Also musst Du das Senden des Textes anderweitig gestallten. So machst Du einen Button
// fürs Verbinden, Trennen und Senden. Du könntest den ConnectError auch als Integer oder
// Cardial machen und Dir an dieser Stelle den Fehler ausgegeben lassen.
end;

_________________
Gruß Harry
Et spes me per dies sine te ducat et amor me ferat, si dolor spem tollit.
elron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

WIN XP
D5 Standard
BeitragVerfasst: So 11.09.05 14:20 
ausblenden Delphi-Quelltext
1:
2:
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);

der sagt mir beim compilieren ClientSocket1Error undefinierter Bezeichner
Harry M.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754

Win 2000, XP
D2005
BeitragVerfasst: So 11.09.05 21:29 
Da stimmt was mit den Deklartionen nicht oder die Proc hat die falsche Bezeichnug. Ist auch teilweise aus meinen Chat den ich mal vor ein paar Tagen gemacht habe. Kann sein das das bei Dir nicht ganz so funtz wie soll. Ich würde mal vorschlagen schicks mal via PN dann kuck ich mal schnell rein.

_________________
Gruß Harry
Et spes me per dies sine te ducat et amor me ferat, si dolor spem tollit.
marconist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

xp sp2
D5 pers
BeitragVerfasst: Sa 17.09.05 15:06 
Hallo elron,

Der Aufruf von sendtext erfolgt bei dir so früh, dass das Aktivieren noch nicht fertig ist.

So lässt du das Programm darauf warten, bevor es weiter geht:

ausblenden Delphi-Quelltext
1:
2:
3:
ClientSocket1.Active := true; //aktiviert den Socket
repeat application.ProcessMessages; until clientsocket1.Active;
ClientSocket1.Socket.Sendtext(Edit1.Text); //sendet den Text


Das habe ich getestet, es funktioniert und kann an deine Bedürfnisse angepasst werden.

srs
marconist

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.