|
Registriert seit: 8. Mär 2008 33 Beiträge |
#13
man ihr seid aber auch anspruchsvoll...
aber nagut wenns sein muss^^ ich hab ne klassische client server verbindung genommen... mit den sockets. delphi 6 client:
Delphi-Quellcode:
und server:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls; const // Port, an dem der ServerSocket auf Clients wartet SERVER_PORT = 12345; type // Verbindungszustände des Clients (für die Button-Steuerung) TMyConState = ( mcsOffline, // nicht verbunden mcsPending, // Verbindungsstatus ändert sich gerade mcsOnline // verbunden ); TForm1 = class(TForm) server: TEdit; nickname: TEdit; log: TMemo; btnconnect: TButton; btndisconnect: TButton; Clients: TListBox; btnsend: TButton; input: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; ClientSocket1: TClientSocket; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure BtnConnectClick(Sender: TObject); procedure BtnDisconnectClick(Sender: TObject); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure BtnSendClick(Sender: TObject); procedure InputKeyPress(Sender: TObject; var Key: Char); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); private FMyConState: TMyConState; procedure SetConState(const Value: TMyConState); public property ConnectionState: TMyConState read FMyConState write SetConState; end; var Form1: TForm1; implementation {$R *.dfm} // bei Programmstart ausführen procedure TForm1.FormCreate(Sender: TObject); begin ClientSocket1.Port := SERVER_PORT; // Port setzen ConnectionState := mcsOffline; // Buttons anpassen end; // neuer Verbindungsstatus -> GUI anpassen procedure TForm1.SetConState(const Value: TMyConState); begin FMyConState := Value; // neuen Status speichern // Buttons entsprechend de-/aktivieren BtnConnect.Enabled := (Value = mcsOffline); BtnDisconnect.Enabled := (Value = mcsOnline); BtnSend.Enabled := (Value = mcsOnline); end; // bei Programmende ausführen procedure TForm1.FormDestroy(Sender: TObject); begin BtnDisconnectClick(Self); // auf jeden Fall abmelden end; // Verbindung zum Server aufnehmen procedure TForm1.BtnConnectClick(Sender: TObject); begin ConnectionState := mcsPending; // Buttons anpassen ClientSocket1.Host := Server.Text; // Serveradresse übernehmen ClientSocket1.Open; // Verbindung versuchen und warten, was passiert // Verbindung OK: weiter bei ClientSocket1Connect(), sonst ClientSocket1Error() end; // Verbindung zum Server trennen procedure TForm1.BtnDisconnectClick(Sender: TObject); begin ConnectionState := mcsPending; // Buttons anpassen if (ClientSocket1.Active) then // noch verbunden? ClientSocket1.Close // dann trennen und warten, was passiert // Trennung OK: weiter in ClientSocket1Disconnect(), sonst ClientSocket1Error() else ConnectionState := mcsOffline; // sonst sind wir schon Offline end; // Verbindung zum Server ist aufgebaut und bereit zum Senden/Empfangen procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin ConnectionState := mcsOnline; // Buttons anpassen Log.Clear; // Protokollfenster löschen Log.Lines.Add('Verbunden mit: '+ClientSocket1.Socket.RemoteHost); end; // Verbindung zum Server (normal) getrennt procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin ConnectionState := mcsOffline; // Buttons anpassen Clients.Clear; // User-Liste leeren Log.Lines.Add('Verbindung getrennt.'); end; // Es ist ein Fehler in der Verbindung aufgetreten; sicherheitshalber trennen procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin if (ClientSocket1.Active) then // noch verbunden? ClientSocket1.Close; // ja, dann trennen ConnectionState := mcsOffline; // Buttons anpassen Clients.Clear; // User-Liste leeren ErrorCode := 0; // Fehler behandelt, keine Exception erzeugen Log.Lines.Add('Verbindungsfehler!'); end; // Benutzernachricht senden ("reden") procedure TForm1.BtnSendClick(Sender: TObject); begin ClientSocket1.Socket.SendText(Input.Text); end; // Eingabetaste im Textfeld -> senden und wieder alles auswählen procedure TForm1.InputKeyPress(Sender: TObject; var Key: Char); begin if (Key = #13) then begin // Return/Enter gedrückt? BtnSendClick(Self); // dann Text senden Input.SetFocus; // Editfeld wieder auswählen Input.SelectAll; // und den ganzen Text markieren end; end; // Daten vom Server empfangen procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin Log.Lines.Add(Socket.ReceiveText); // Daten lesen end; end.
Delphi-Quellcode:
reicht das jetz?
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls; const // Port, an dem der ServerSocket auf Clients warten soll SERVER_PORT = 12345; type TForm1 = class(TForm) Log: TMemo; Input: TEdit; BtnSend: TButton; Clients: TListBox; ServerSocket1: TServerSocket; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure DeleteClient(Socket: TCustomWinSocket); procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure BtnSendClick(Sender: TObject); procedure InputKeyPress(Sender: TObject; var Key: Char); procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSend(const Text: String); procedure Broadcast(const Name, Text: String); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} // bei Programmstart ausführen procedure TForm1.FormCreate(Sender: TObject); begin ServerSocket1.Port := SERVER_PORT; // Port setzen ServerSocket1.Open; // Server aktivieren end; // bei Programmende ausführen procedure TForm1.FormDestroy(Sender: TObject); begin if (ServerSocket1.Active) then begin // wenn der Server noch aktiv ist Broadcast('System','Server beendet.'); // Clients benachrichtigen ServerSocket1.Close; // und dann beenden end; end; // ein neuer Client hat sich verbunden procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin Clients.AddItem(Socket.RemoteHost,Socket); // in die Liste end; // Client aus der Userliste entfernen procedure TForm1.DeleteClient(Socket: TCustomWinSocket); var i: Integer; begin i := Clients.Items.IndexOfObject(Socket); // Client noch in der Liste? if (i > -1) then begin // ja Clients.Items.Delete(i); // dann entfernen end; end; // ein Client hat sich getrennt procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin DeleteClient(Socket); // Client aus der Userliste nehmen end; // Fehler in einer Clientverbindung aufgetreten; Client sicherheitshalber trennen procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin if (Socket.Connected) then // noch verbunden? Socket.Close; // dann Verbindung trennen DeleteClient(Socket); // Client aus der Userliste nehmen ErrorCode := 0; // Fehler behandelt, keine Exception erzeugen end; // Daten zu allen Clients senden procedure TForm1.ClientSend(const Text: String); var i: Integer; begin for i := 0 to Clients.Count-1 do // an alle Verbindungen... (Clients.Items.Objects[i] as TCustomWinSocket).SendText(Text); // senden end; // Text-Meldung ausgeben und an die Clients weiterreichen procedure TForm1.Broadcast(const Name, Text: String); begin Log.Lines.Add(Name+': '+Text); ClientSend(Name+': '+Text); end; // System-Nachricht senden procedure TForm1.BtnSendClick(Sender: TObject); begin Broadcast('System',Input.Text); end; // Eingabetaste im Textfeld -> senden und wieder alles auswählen procedure TForm1.InputKeyPress(Sender: TObject; var Key: Char); begin if (Key = #13) then begin // Return/Enter gedrückt? BtnSendClick(Self); // dann Text senden Input.SetFocus; // Editfeld wieder auswählen Input.SelectAll; // und den ganzen Text markieren end; end; // Daten von einem Client empfangen procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var i: Integer; begin i := Clients.Items.IndexOfObject(Socket); // Client identifizieren if (i > -1) then begin // Client ist in der Liste, Index "i" ist gültig Log.Lines.Add(Socket.RemoteHost+': '+Socket.ReceiveText); end else // Client ist nicht in der Liste?! (sollte nicht auftreten) Log.Lines.Add('Daten von unregistriertem Client empfangen: '+Socket.ReceiveText); end; end. |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |