AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Konsolen TCP + Socketserver
Thema durchsuchen
Ansicht
Themen-Optionen

Konsolen TCP + Socketserver

Ein Thema von RedShakal · begonnen am 8. Jan 2010 · letzter Beitrag vom 10. Feb 2010
 
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#5

Re: Konsolen TCP + Socketserver

  Alt 8. Jan 2010, 22:17
Zitat von RedShakal:
..wollte gerade meinem Konsolen TCP Server noch einen SocketChat hinzufügen. Der Server wird initialisiert, jedoch werden die Ereignisse nicht aufgerufen.
Hallo RedShakal, die Ereignisse werden nicht aufgerufen, weil Du kein Dispatch durchführst.

Delphi-Quellcode:

    repeat
      if PeekMessage(MsgRec, 0, 0, 0, PM_REMOVE) then
        DispatchMessage(MsgRec) else WaitMessage;
    until (MsgRec.Message = WM_QUIT) or (MsgRec.Message = WM_CLOSE);
Zitat von RedShakal:
Ich wollte euch Fragen ob ihr mal über meinen Source schauen könnt wo der Fehler liegen könnte. Der TCP Server funktioniert im übrigen.
Du synchronisierst Dateizugriffe und INI-File Read und Write im INDY Thread nicht, da ja mehrere Clients gleichzeitig zugreifen können, knallts da irgendwann. Also Thread synchronisieren. Auch haben Sleeps in so einer Anwendung nichts zu suchen.


Zitat von RedShakal:
Ich vermute der Fehler liegt darin, das ich 2 Server nacheinander erstelle und irgentwie die Ereignisse durch das While True do Sleep(50); nicht aufrufe. Der TCP Server funktioniert Standalone im übrigen Prima.
Solange du kein Binding und oder den gleichen Port verwendest, ist dies egal.

Beispiel wie man das in einer Konsole implementieren kann:

Delphi-Quellcode:


program ConsoleServer;

{$APPTYPE CONSOLE}

uses
  Windows,
  Messages,
  SysUtils,
  Winsock,
  ScktComp;

type
  TNotifyEvent = procedure(sender : TObject) of object;

type
  TChatServer = class
  private
    FServer: TServerSocket;
    procedure ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  public
    constructor create;
    destructor destroy; override;
end;

var
  ChatServer: TChatServer;
  MsgRec : TMsg;

procedure TChatServer.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  writeln(
    'Ein Client hat sich mit folgendem eindeutigen Socket verbunden. Socket: ' +
      inttostr(Socket.SocketHandle)
      );
end;

procedure TChatServer.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  writeln(
    'Ein Client hat sich mit folgendem eindeutigen Socket abgemeldet. Socket: '+
      inttostr(Socket.SocketHandle)
      );
end;

procedure TChatServer.ServerSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  writeln(
    'Ein Clientverbindung mit folgendem eindeutigen Socket: ' +
      inttostr(Socket.SocketHandle) +
        ' hat einen Fehler verursacht, der socket Fehlercode:' +
          inttostr(ErrorCode)
      );
end;

procedure TChatServer.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  cbRcv: integer;
  RcvBuf: array [0..32767] of Byte;
  s: string;
begin
  cbRcv := Socket.ReceiveBuf(RcvBuf[0], Length(RcvBuf));
  if (cbRcv > 0) and (Socket.SocketHandle > 0) then begin
    SetLength(s, cbRcv);
    move(RcvBuf[0], s[1], cbRcv);
    writeln('Für Client mit folgendem eindeutigen Socket: ' +
      inttostr(Socket.SocketHandle) + ' wurden ' + IntToStr(cbRcv) + ' Bytes ' +
        'mit folgenden Daten [ ' + s + ' ] empfangen'
        );
  end;
end;

constructor TChatServer.create;
begin
  Self.FServer := TServerSocket.create(nil);
  with Self.FServer, Self do begin
    ServerType := stNonBlocking;
    Port := 8088;
    OnClientConnect := ServerSocketClientConnect;
    OnClientDisconnect := ServerSocketClientDisconnect;
    OnClientError := ServerSocketClientError;
    OnClientRead := ServerSocketClientRead;
    Active := true;
  end;
end;

destructor TChatServer.destroy;
var
  i: integer;
begin
  for i := 0 to Self.FServer.Socket.ActiveConnections - 1 do begin
    shutdown(Self.FServer.Socket.Connections[i].SocketHandle, SD_BOTH);
    Self.FServer.Socket.Connections[i].Close;
  end;
  inherited;
end;

begin
  ChatServer := TChatServer.Create;
  try
    repeat
      if PeekMessage(MsgRec, 0, 0, 0, PM_REMOVE) then
        DispatchMessage(MsgRec) else WaitMessage;
    until (MsgRec.Message = WM_QUIT) or (MsgRec.Message = WM_CLOSE);
  finally
    ChatServer.Free;
    ChatServer := nil;
  end;
end.
lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  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 23:55 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