AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

fehler 10049

Offene Frage von "matze222"
Ein Thema von matze222 · begonnen am 10. Mär 2008 · letzter Beitrag vom 18. Mär 2008
 
matze222

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

Re: fehler 10049

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


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz