Hallo Leute,
Ich versuche nun seit 3 Tagen einen Chat-Clienten zu erstellen der ähnlich funktionieren würde wie icq/msn, leider nicht erflogreich. Es scheitert schon an dem erstellen der kleinen Chatfenster wie man sie von icq kennt.
Ich will also mit jedem User der connected in einer separaten Form chatten, wobei die MainForm die Kontaktliste ist und auch der ChatServer in derselben Anwendung läuft.
Habe es nun mit
Indy IdTCPServer und TServerSocket versucht, hat leider nichts gebracht, ich krieg's nicht gebacken folgendes zu tun:
1.) Wenn ein Client connected einen Thread
und eine Form (ChatWindow) zu erstellen.
2.) Wenn ein Client daten sendet (text reicht ersmal aus) den Client zu identifizieren und die dazugehörige Form zu mit der Nachricht aktualisieren.
3.) Ich muss natürlich auch Nachrichten versenden können, also enthält jedes Chatwindow auch eingabefelder etc und soll text zum Clienten senden.
Was ich bisher maximal erreicht habe war, dass ich sich schon das TMemo in dem ChatWindows geupdated hat, ich konnte aber mit dem Fenster nicht bewegen (bzw nur dann wenn der Klient gesendet hat und der Thread drauf reagiert hat), von Nachrichten eingeben und senden ganz zu schweigen. Ausserdem stürzt es bei mehr als einem Client ab.
Bin jetzt nach unzähligen Versuchen und Modifikationen etwas ratlos, alles was ich im Forum und Google zum Thema
VCL und Threads gefunden habe bezieht sich immer auf das updaten der HauptForm, nirgendwo findet man Beispiele wie ich Applikationen ala icq schreibe (halt nur plus der Server in der selben App)
Hilfe? Ist überhaupt der Ansatz richtig in dem "Client-Abhör-Thread" eine TForm zu erstellen richtig?
Hier der Ansatz mit dem TServerSocket, ich glaube den Ansatz mit
Indy-Komponenten werde ich eh nicht mehr verfolgen da man viel zu wenig Dokumentation zu ihnen findet. Die beiden Prozeduren habe ich in einem Beispiel-Chat gefunden und etwas angepasst.
Delphi-Quellcode:
Type
TForm1 = Class(TForm)
...
end;
TChatServerThread = Class(TServerClientThread)
public
Procedure ClientExecute; override;
End;
Var
Form1: TForm1;
Implementation
...
Procedure TChatServerThread.ClientExecute;
Var
Data: Array[0..1023] Of char;
RecText: String;
SocketStream: TWinSocketStream;
CCI: TChatWindowIn;
Begin
CCI:=TChatWindowIn.Create(Form1);
CCI.Show;
While Not Terminated And ClientSocket.Connected Do
Try
SocketStream := TWinSocketStream.Create(ClientSocket, 30000);
Try
FillChar(Data, SizeOf(Data), 0);
If SocketStream.Read(Data, SizeOf(Data)) = 0 Then
Begin
sleep(1);
ClientSocket.Close;
Terminate;
End;
RecText := Data;
CCI.Messages.Lines.Add(RecText);
If ClientSocket.Connected Then
Begin
ClientSocket.SendText(RecText);
End;
Finally
SocketStream.Free;
End;
Except
HandleException;
End;
End;
Procedure TForm1.ServerSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
Var SocketThread: TServerClientThread);
Begin
// Create a new thread for connection
SocketThread := TChatServerThread.Create(False, ClientSocket);
ClientSocket.SendText('Welcome to Server'+#13#10);
End;
Das ChatWindow sieht so aus, ist auch noch nichts drin wirklich.
http://img215.imageshack.us/img215/9...benanntsz6.jpg
Danke im Voraus.