Thema: Delphi fehler 10049

Einzelnen Beitrag anzeigen

matze222

Registriert seit: 8. Mär 2008
33 Beiträge
 
#13

Re: fehler 10049

  Alt 11. Mär 2008, 12:50
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:
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.
und server:

Delphi-Quellcode:
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.
reicht das jetz?
  Mit Zitat antworten Zitat