var severSD : array of TServerSocket;//动态创建
我要回复 | 我感兴趣 | 打印贴子 | 推荐给朋友 | 关闭窗口  
主  题:关于ServerSocket的动态创建问题
作  者:oldsword
所属论坛:Delphi
问题点数:50
回复次数:0
发表时间:2000-12-26 18:01:00
 
var severSD : array of TServerSocket;//动态创建
...
//初始化并开始监听//  SetLength(ServerSD, 10);错了setlength只是对数据类型有效,
//  对于组件和对象最好用VarArrayCreate
  serverSD:=VarArrayCreate([0,9],varVariant);//这样Create
  for i:=0 to 9 do
  being
    ServerSD[i] := TserverSocket.Create(self);//创建
    ServerSD[i].OnClientConnect := ServerSocket.OnClientConnect;//定义事件
    ServerSD[i].Port := i;//定义监视的端口
    ServerSD[i].Active := True;
  end; 
 

解决方案 »

  1.   

    for i:=0 to 9 do
      begin  //active=false;close serversocket
        ServerSD[i].Active := False;//出错!!!提示的意思好象是说读了错误的内存地址
      end;
      

  2.   

    to saoren:
    很遗憾,你的方法有点不对。
    我试了一下,VarArrayCreate不能初始化动态控件,在编译的时候会提示控件没有初始化([Warning] Main.pas(325): Variable 'ServerSocketD' might not have been initialized)。还有别的办法嘛?
    或者是我的实验有问题,那就请提供一点比较详细的代码,先谢谢了!
      

  3.   


    const SNum=10;type
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        procedure FormCreate(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        ServerSockets:array of TServerSocket;
        procedure MyOnClientConnect(Sender: TObject;
          Socket: TCustomWinSocket);
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    const SNum=10;
    var i:integer;
    begin
      ServerSockets:=VarArrayCreate([0,SNum-1],varVariant);
      for i:=0 to SNum-1 do
      begin
        ServerSockets[i]:=TServerSocket.Create(self);
        with ServerSockets[i] do
        begin
          Active:=false;
          Port:=i;
          OnClientConnect:=MyOnClientConnect;
          Active:=true;
        end;
      end;
    end;procedure TForm1.MyOnClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      //how do you do???
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    var i:integer;
    begin
      for i:=0 to SNum-1 do
      begin
        ServerSockets[i].Active :=false;
      end;
    end;
      

  4.   

    你这样做的是什么?想连多个客户端还是什么?
    其实一个ServerSocket就可以连接多个客户端了。
    ServerSocket.ActiveConnections是它已经连了几个客户端的Socket数。
    用:
    for i:=0 to ServerSocket.ActiveConnections-1 do
      ServerSocket.Socket.Connections[i].SendText('msg');
    就可以向这个ServerSocket连的客户端发送消息了。
    不用建立多个ServerSocket。
    如果你要做成多线程的话,建议你去看看(\delphi5\source\vcl\scktsrvr.dpr).
    那里面有很详细的说明。
    如果不是很懂(我也不是很懂),可以到我的帖子一起讨论:
    www.csdn.net/expert/topic/51443.shtm
      

  5.   

    我要监听多个端口,而不是要连接客户端,说白了,我要写一个端口监听器,如果有人在‘撞’我的门,我就留下他的指纹,就这么简单。
    谢谢你的代码!原来是控件的定义应当放在PUBLIC里,嘿嘿,真是苯!!!再次感谢!!!