我正做一个局域网的c/s数据库系统.
若干客户端和一个服务器.服务器需要监测各个客户端的情况,例如:客户端是否启动,关闭电脑,发送信息等等.
原来没有做过这一块,请问是不是用Indy10的IdTCPServer和IdTCPClient来实现?最好给我一个例程看看.indy10的demo好像没有我要的功能.谢谢

解决方案 »

  1.   

    LZ胡说八道,Indy10的Demo没有演示发送和接受数据的功能?
      

  2.   

    给你一个我在网上找得例子,我自己改了改。这是连接的部分,控制的你自己写吧。
    unit MainFrm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdCustomTCPServer, IdTCPServer, IdBaseComponent, IdComponent,
      IdTCPConnection, IdTCPClient, ComCtrls, StdCtrls, ExtCtrls, IdContext;type
      TfrmMain = class(TForm)
        tcpClient: TIdTCPClient;
        tcpServer: TIdTCPServer;
        statusBar: TStatusBar;
        GroupBox1: TGroupBox;
        GroupBox2: TGroupBox;
        serverip: TLabeledEdit;
        serverport: TLabeledEdit;
        serverstop: TButton;
        clientcon: TButton;
        clientdiscon: TButton;
        memo: TMemo;
        msg: TEdit;
        sendbt: TButton;
        serverstart: TButton;
        procedure tcpServerExecute(AContext: TIdContext);
        procedure tcpServerConnect(AContext: TIdContext);
        procedure serverstopClick(Sender: TObject);
        procedure serverstartClick(Sender: TObject);
        procedure sendbtClick(Sender: TObject);
        procedure msgKeyPress(Sender: TObject; var Key: Char);
        procedure FormCreate(Sender: TObject);
        procedure clientdisconClick(Sender: TObject);
        procedure clientconClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;implementation{$R *.dfm}procedure TfrmMain.clientconClick(Sender: TObject);
    begin //客户端点了连接按钮
      if serverip.Text = '' then
      begin
        MessageDlg('请输入服务器IP',mtError,[mbok],0);
        serverip.SetFocus;
      end;
      if serverport.Text = '' then
      begin
        MessageDlg('请输入服务器端口号',mtError,[mbok],0);
        serverport.SetFocus;
      end;
      tcpclient.Host := serverip.Text;
      tcpClient.Port := StrtoInt(serverport.Text);
      try
        tcpclient.Connect;
        statusBar.SimpleText := '已连接' + serverip.Text;
        memo.Lines.Add('已连接' + serverip.Text)
      except
        statusBar.SimpleText := '服务器连接不上';
      end;
    end;procedure TfrmMain.clientdisconClick(Sender: TObject);
    begin //客户端点了断开
      tcpclient.Disconnect();
      memo.Lines.Add('客户端已断开');
      statusbar.SimpleText := '客户端已断开';
    end;procedure TfrmMain.FormCreate(Sender: TObject);
    begin
      //自动启动服务器
      try
        tcpserver.Active := true;
        statusbar.SimpleText := '服务器已启动';
      except
        statusbar.SimpleText := '本软件使用的端口被占用';
      end;
    end;procedure TfrmMain.msgKeyPress(Sender: TObject; var Key: Char);
    begin
      if key = #13 then
      begin
        sendbt.Click;
      end;
    end;procedure TfrmMain.sendbtClick(Sender: TObject);
    begin
      //发送信息
      if msg.Text = '' then
      begin
        MessageDlg('请输入要发送的信息',mtError,[mbOk],0);
        msg.SetFocus;
      end
      else
      begin
        tcpClient.Socket.WriteLn(msg.Text);
        //tcpClient.SendCmd(msg.Text);
        //tcpclient.WriteLn(msg.Text);
      end;
    end;procedure TfrmMain.serverstartClick(Sender: TObject);
    begin
      //服务器端启动
      if not tcpServer.Active then
      begin
        tcpServer.Active := true;
        statusBar.SimpleText := '服务器端已启动';
      end;
    end;procedure TfrmMain.serverstopClick(Sender: TObject);
    begin
      //服务器端停止
      if tcpServer.Active then
      begin
        tcpServer.Active := false;
        statusBar.SimpleText := '服务器端已停止';
      end;
    end;procedure TfrmMain.tcpServerConnect(AContext: TIdContext);
    begin
      memo.Lines.Add('接收来自'+AContext.Connection.Socket.Binding.PeerIP+'的连接');
    end;procedure TfrmMain.tcpServerExecute(AContext: TIdContext);
    var
      readstr: string;
    begin
      readstr := AContext.Connection.Socket.ReadLn();
      memo.Lines.Add(readstr);
    end;end.
      

  3.   

    你把IndyTCP那个例子扩展一个就可以了。就像心跳,c向s发送心跳,s检测c的心跳,超过监听预设时间,就认为c不存在。
    c=Client
    s=Server