client socket的问题(急啊急)!!!分数不够加!(100分)

  • 主题发起人 主题发起人 fox_red
  • 开始时间 开始时间
F

fox_red

Unregistered / Unconfirmed
GUEST, unregistred user!

我得程序要用到一个client socket 和多个client server 通讯,
所以需要动态的给client socket的IP和port进行赋值.
现在关键是我在我得循环去访问client server的时候我发现不能在同一个函数里面实现连
接和发送的事情.
代码大概如下:
我的memo1里面放的是需要连接的IP地址列表;clientsocket的port是一样,所以不需要动态
赋值

procedure TForm1.Button1Click(Sender: TObject);
var
sendbuf:string;
i,j:Integer;
begin

for i:=0 to memo1.lines.count-1 do
begin
if ClientSocket1.Active=True then
ClientSocket1.Close;
ClientSocket1.Address:=memo1.lines
ClientSocket1.Active:=True;
Sleep(1000);
if ClientSocket1.Active=True then
begin
sendbuf:='ilove you !!!';
ClientSocket1.Socket.SendBuf(sendbuf[1],Length(sendbuf));
end;
end;
end;
--
 
在控件的事件里不要用Sleep程序。
用Sleep会阻止VCL线程对消息的处理,自然就不会处理Socket建立连接时的一些必须操作
把Sleep改一下,用Application.ProcessMessages,用来这个后要改变Button1的Enabled属性,防止被多次单击

procedure TForm1.Button1Click(Sender: TObject);
var
sendbuf:string;
i,j:Integer; tc:DWORD;
begin
Button1.Enabled:=false;
try
for i:=0 to memo1.lines.count-1 do
begin
if ClientSocket1.Active=True then
ClientSocket1.Close;
ClientSocket1.Address:=memo1.lines
ClientSocket1.Active:=True;
//Sleep(1000);干掉Sleep,用下面代替
tc:=GetTickCount;
while GetTickCount-tc<1000 do Application.ProcessMessages;
if ClientSocket1.Active=True then
begin
sendbuf:='ilove you !!!';
ClientSocket1.Socket.SendBuf(sendbuf[1],Length(sendbuf));
end;
end;
finally
Button1.Enabled:=true;
end;
end;

线程里用Sleep,在控件事件中用Sleep不安全的,如果循环次数多的话,甚至会造成大量消息积压,把程序给搞死的
 
现在这个回答我很满意了,但是我想再问你一点问题
我在循环给serversocket发消息的时候,我想判断一下是否前面发的包服务器是否回应了
只有当前面一个包服务器做了正确回应以后,我才继续给第二个IP发数据包.
帮忙再看看,如果帮我把这个问题也解决了的话,我还可以给你多加分的!
 
ClientSocket各个Serversocket是否有一定格式的应答也即握手协议?
我做的项目有握手协议,所以靠serversocket的应答内容来判断
 
第一个问题我遇到过类似的Sleep造成错误,第二个我没法试,只能给你些建议
1。发送前设置一标志(true)
2。发送后,在某一时间段内检测该标志是否被复位(false);若复位则说明收到,否则时间超时后,怎么处理看你自己了
3。注意等待时,不要用Sleep,还按上面的来


4.ServerSoket收到信息后,要返回特定信息给ClientSocket
5.在ClientSocket 的OnServerRead事件中,判断接受内容,设置发送标志复位
 
Avenir
你后来的想法和我现在用的是一样的,看来也只有这种方式比较可行了
非常感谢!
 
后退
顶部