Entwickler-Ecke

Internet / Netzwerk - Einseitiger Chat funktioniert nicht


elron - So 11.09.05 12:47
Titel: Einseitiger Chat funktioniert nicht
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:

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:

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. - So 11.09.05 12:55

:welcome: im DF!!


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;


elron - So 11.09.05 13:10

habs fast hingekriegt:

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

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. - So 11.09.05 13:35


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;


elron - So 11.09.05 14:20


Delphi-Quelltext
1:
2:
procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);

der sagt mir beim compilieren ClientSocket1Error undefinierter Bezeichner


Harry M. - 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.


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


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.