http://blog.163.com/huangjian_w/blog/static/19437281200842010460625/

ICS网络编程Demo演示  

2008-05-20 22:46:00|  分类: 网络传输和应用|举报|字号 订阅

 
 
    近期有朋友和我讨论关于ICS编程的问题,其实ICS的C/S编程还是比较简单的。ICS的Server也是比较稳定的。不过它的实时性能却不怎么样,如果你的数据量不大客户端不超过1000估计没有问题。我曾经试验,如果流量超过每秒1Mbit/S,好几次Server都挂了。说明ICS在大流量的处理的性能还有待改进。不过我研究他也是考虑到他的稳定性。要好于indy组件。各有千秋嘛。
    刚刚在看新闻,四川的地震实在太惨了,看不下去,上来发个代码,换换心情。今晚还要应付余震,听省地震局预报要持续到22号,哎,中国的多灾之年。坚信咱们一定能坚强度过,也默默祝愿大家平平安安。

//////////////////////////////服务器端代码/////////////////////////////////////////
unit u_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OverbyteIcsWndControl, OverbyteIcsWSocket,
  OverbyteIcsWSocketS;

type
  TTcpSrvClient = class(TWSocketClient)
  public
    Logintype:integer;
    ConnectTime : TDateTime;
  end;

  TForm1 = class(TForm)
    mmo1: TMemo;
    wscktsrvr1: TWSocketServer;
    btn1: TButton;
    btn2: TButton;
    edt1: TEdit;
    btn3: TButton;
    procedure btn1Click(Sender: TObject);
    procedure wscktsrvr1ClientConnect(Sender: TObject;
      Client: TWSocketClient; Error: Word);
    procedure wscktsrvr1ClientDisconnect(Sender: TObject;
      Client: TWSocketClient; Error: Word);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ClientDataAvailable(Sender: TObject; Error: Word);
    procedure ProcessData(Client : TTcpSrvClient);
    procedure ClientBgException(Sender       : TObject;
                                E            : Exception;
                                var CanClose : Boolean);
    procedure ClientLineLimitExceeded(Sender        : TObject;
                                      Cnt           : LongInt;
                                      var ClearData : Boolean);    
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
    wscktsrvr1.Proto       := 'tcp';         { Use TCP protocol  }
    wscktsrvr1.Port        := '7000';      { Use telnet port   }
    wscktsrvr1.Addr        := '0.0.0.0';     { Use any interface }
    wscktsrvr1.ClientClass := TTcpSrvClient; { Use our component }
    wscktsrvr1.Listen;                       { Start litening    }
    wscktsrvr1.Banner :='';
    wscktsrvr1.BannerTooBusy := '';
    mmo1.Lines.Add('转发启动。。。。。。');
end;

procedure TForm1.ClientBgException(Sender: TObject; E: Exception;
  var CanClose: Boolean);
begin

end;

procedure TForm1.ClientDataAvailable(Sender: TObject; Error: Word);
begin
   with Sender as TTcpSrvClient do
   begin
      mmo1.Lines.Add('接收数据(' +inttostr(RcvdCount) +'):'+ReceiveStr);
      SendStr(ReceiveStr);
   end;
end;

procedure TForm1.ClientLineLimitExceeded(Sender: TObject; Cnt: Integer;
  var ClearData: Boolean);
begin

end;

procedure TForm1.ProcessData(Client: TTcpSrvClient);
begin

end;

procedure TForm1.wscktsrvr1ClientConnect(Sender: TObject;
  Client: TWSocketClient; Error: Word);
begin
    with Client as TTcpSrvClient do begin
        OnDataAvailable     := ClientDataAvailable;
        OnLineLimitExceeded := ClientLineLimitExceeded;
        OnBgException       := ClientBgException;
        ConnectTime         := Now;
        mmo1.Lines.Add('客户端' + PeerAddr + '(' + PeerPort + ')登录');
    end;
end;

procedure TForm1.wscktsrvr1ClientDisconnect(Sender: TObject;
  Client: TWSocketClient; Error: Word);
begin
    with Client as TTcpSrvClient do begin
        mmo1.Lines.Add('客户端' + PeerAddr + '(' + PeerPort + ')断开登录,在线:' + FormatDateTime('hh:nn:ss',Now - ConnectTime));
    end;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  wscktsrvr1.Close;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
  wscktsrvr1.Client[0].SendStr(edt1.Text);
end;

end.
//////////////////////////////////////////////////////////////////////////////客户端代码/////////////////////////////////////////////////////////////////////////
unit u_Client;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OverbyteIcsWndControl, OverbyteIcsWSocket;

type
  TForm1 = class(TForm)
    wsckt1: TWSocket;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    edt1: TEdit;
    mmo1: TMemo;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure wsckt1SessionAvailable(Sender: TObject; ErrCode: Word);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  wsckt1.Addr := '127.0.0.1';
  wsckt1.Port := '7000';
  wsckt1.Proto := 'TCP';
  wsckt1.Connect;

end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  wsckt1.Close;
end;

procedure TForm1.btn3Click(Sender: TObject);
var
 buf:array [0..100] of Char;
begin
  StrPCopy(buf,edt1.Text);
  wsckt1.Send(@buf,Length(edt1.Text));
end;

procedure TForm1.wsckt1SessionAvailable(Sender: TObject; ErrCode: Word);
begin
      mmo1.Lines.Add('接收数据:'+wsckt1.ReceiveStr);
end;

end.