现在需要开发一个基于多个客户端的TCP连接的服务器端程序,完成侦听接收客户端的连接、数据接收、数据向客户端发送的通信程序。请各位大侠给一点具体的建议。谢谢

解决方案 »

  1.   

    用所谓的IOCP吧,我正打算学习,顺便你懂了,我跟帖子学习下,哈哈。
      

  2.   

    如果没做过,新手建议用INDY,我的资源里有一个,如果用API的话,也不困难,就调用几个SOCKET API(SOCKET,BIND,LISTEN,ACCEPT,SEND,RECV;CONNECT)
      

  3.   

    TClientSocket & TServerSocket
      

  4.   

    IOCP?活佛,你就别取笑我了。有什么好建议。就分享下,呵呵。
      

  5.   

    建议用delphi自带的网络控件(非Indy),QQ 287413288
      

  6.   

    使用TIdUDPServer、TIdUDPClient、TIdAntiFreeze,因为可以穿透网关,而且,这方面的资料容易找。
      

  7.   

    这个需求还需要细化:
    用户规模,同时在线的数量范围,平时及峰值的数据发送量才能决定采用iocp还是indy甚至自带的socket控件还是api....
      

  8.   

    TClientSocket,TServerSocket,这2个搞搞,Indy都是基于这2个的,而且这2个是delphi自带的,不象Indy,Indy9 和 Indy10 还不一样。如果用了indy 到时程序更新源代码时,会出现不兼容的。
      

  9.   

    TClientSocket,TServerSocket 2个控件。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ScktComp, ComCtrls;type
      TForm1 = class(TForm)
        GSER: TServerSocket;
        GClient: TClientSocket;
        StatusBar1: TStatusBar;
        Label39: TLabel;
        AddrList: TListBox;
        AddrList2: TListBox;
        btn1: TButton;
        AddrList3: TListBox;
        btn2: TButton;
        procedure GSERAccept(Sender: TObject; Socket: TCustomWinSocket);
        procedure GSERClientRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure GClientConnect(Sender: TObject; Socket: TCustomWinSocket);
        procedure GClientRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure btn1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.GSERAccept(Sender: TObject; Socket: TCustomWinSocket);
    var
     AnsiTmp :AnsiString;
    begin
       StatusBar1.Panels.Items[0].Text := '收到新连接: ' + Socket.RemoteAddress;
      Label39.Caption:= '现有 %d 个连接'+ inttostr(GSER.Socket.ActiveConnections) ;
      AnsiTmp:=IntToStr(Socket.SocketHandle);
      AddrList.Items.Add(Socket.RemoteAddress+'::'+AnsiTmp);  //在列表中线上 下位机地址
      //GPRS.SocketHandle:=Socket.SocketHandle; //保存当前的新连接的SocketHandle;
      AddrList.Items.Add(Socket.RemoteAddress+'::'+AnsiTmp);  //在列表中线上 下位机地址end;procedure TForm1.GSERClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      s_ansiTmp :String;
      nRecByte :Integer;
      ucRecByte :array[0..8191] of Byte;
      iTemp  :Integer;
      RemoteAddress,SocketHandle :string;
    begin    nRecByte:=Socket.ReceiveLength();
        Socket.ReceiveBuf(ucRecByte,nRecByte);    RemoteAddress:= Socket.RemoteAddress ;
        SocketHandle := IntToStr(Socket.SocketHandle);    s_ansiTmp := '从 '+ RemoteAddress + '::' + SocketHandle+
              ' 接收到数据:xxxxxxxxxxxxxxxxx';
       AddrList2.Items.Add( s_ansiTmp );//显示end;procedure TForm1.GClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    begin
      StatusBar1.Panels.Items[1].Text:= '成功连接服务器: ' +
      Socket.RemoteAddress+'::'+IntToStr(Socket.SocketHandle);
    end;procedure TForm1.GClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      AnsiTmp:AnsiString ;
      nRecByte :Integer;
      ucRecByte :array[0..8191] of  Byte;
      iTemp :Integer;
    begin
      nRecByte:=Socket.ReceiveLength();   //接收的数据长度
      Socket.ReceiveBuf(ucRecByte,nRecByte);  //接收数据
      AnsiTmp:='从控制中心收到'+Socket.RemoteAddress+'::'+IntToStr(Socket.SocketHandle);
      AnsiTmp := AnsiTmp + ' ';
      AnsiTmp := AnsiTmp + Socket.RemoteAddress;
      AddrList3.Items.Add(AnsiTmp);//显示end;procedure TForm1.btn1Click(Sender: TObject);
    begin
     GClient.Host:='127.0.0.1';
     GClient.Port:=8888;
     GClient.Open();
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      GSER.Close();
      GSER.Port:=8888;  //服务器监听端口
      GSER.Active:=true;  //打开监听
    end;end.
      

  10.   

    100个客户端以下用INDY,以上用IOCP
      

  11.   

    公司的前辈在linux上用kylix5做了一个这功能的程序,原理如下:定义这么一个类,每次监听到TCP连接建立时,建立一个线程对象,然后监听客户机发送的“登陆包”,从中解析出维持连接所需的一些资料,主要用于判断哪个连接发出的东西,哪个或者哪些连接能收到。所有这些线程对象放在一个列表里面,以一个固定时间间隔进行遍历,如果最近5分钟内,客户端不产生向上的数据流量,释放之;如果该连接被中断,释放之;如果该连接发送“离线包”,释放之最初版大概是06年制作的,稳定使用到现在……基础算法没变,只是一些限制性的东西增加了。