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;
我要回复 | 我感兴趣 | 打印贴子 | 推荐给朋友 | 关闭窗口
主 题:关于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;
begin //active=false;close serversocket
ServerSD[i].Active := False;//出错!!!提示的意思好象是说读了错误的内存地址
end;
很遗憾,你的方法有点不对。
我试了一下,VarArrayCreate不能初始化动态控件,在编译的时候会提示控件没有初始化([Warning] Main.pas(325): Variable 'ServerSocketD' might not have been initialized)。还有别的办法嘛?
或者是我的实验有问题,那就请提供一点比较详细的代码,先谢谢了!
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;
其实一个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
谢谢你的代码!原来是控件的定义应当放在PUBLIC里,嘿嘿,真是苯!!!再次感谢!!!