问一个关于ClientSocket的问题 ( 积分: 300 )

  • 主题发起人 主题发起人 Rover
  • 开始时间 开始时间
R

Rover

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下:
MainClientSocket := TClientSocket.Create(Nil);
MainClientSocket.Active := False;
MainClientSocket.Address := ServerAddress;
MainClientSocket.Port := ServerPort;
MainClientSocket.ClientType := ctNonBlocking;
MainClientSocket.Active := True;
执行完后我发现Active的状态还是False,只有继续执行一句:
MainClientSocket.Socket.Connect(0);
后Active的状态才是True,这是为什么呢?
 
代码如下:
MainClientSocket := TClientSocket.Create(Nil);
MainClientSocket.Active := False;
MainClientSocket.Address := ServerAddress;
MainClientSocket.Port := ServerPort;
MainClientSocket.ClientType := ctNonBlocking;
MainClientSocket.Active := True;
执行完后我发现Active的状态还是False,只有继续执行一句:
MainClientSocket.Socket.Connect(0);
后Active的状态才是True,这是为什么呢?
 
MainClientSocket := TClientSocket.Create(Nil);
MainClientSocket.Active := False;
MainClientSocket.Address := ServerAddress;
MainClientSocket.Port := ServerPort;
MainClientSocket.ClientType := ctNonBlocking;
MainClientSocket.open;<------------就改这里
 
还是不行,这个ClientSock控件是不是最好放在可视Form上啊?
 
if ClientSocket1.Active=False then
begin
ClientSocket1.Port:=StrToint(EdtPort.Text);
ClientSocket1.Address:=EdtIP.Text;
ClientSocket1.Host:=EdtSName.Text;
ClientSocket1.ClientType := ctNonBlocking;
ClientSocket1.Open;
end;
我的没有问题;
跟放在可视窗与不可视窗没有关系;CREATE(NIL)一句可不要,放个ClientSocket就可;
 
你的服务端开了没有?如果开了那么这种原因好像是ClientSock的属性没有设置好,最好把ClientSock控件放在可视Form上,或者对应一下它的属性,然后定义你动态创建ClientSock的属性就像MainClientSocket.ClientType := ctNonBlocking;一样。
 
Server端是什么做的不清楚,对方只给了一个接口。
 
procedure TForm1.Button1Click(Sender: TObject);
begin
cs.Close;
cs.ClientType:=ctblocking;
cs.Host:='www.163.com';
cs.Port:=80;
cs.Active:=true;
if cs.Active=true then
showmessage('ok');
end;
 
自己做个测试,FORM1上加个ClientSocket。BUTTON1事件如下:
// if ClientSocket1.active then ClientSocket1.close;
ClientSocket1.Address := ServerAddress;
ClientSocket1.Port := ServerPort;
// ClientSocket1.ClientType := ctNonBlocking;
ClientSocket1.Open;
if not ClientSocket1.Active then
showmessage('没这么快,还没连接上');
就可以了;
*************
我作过测试,确实ClientSocket1.Active=FALSE;
我理解是这样:
客服端的打开(无论是OPEN或ACTIVE=TRUE),其实是与服务器连接;
当然要时间;

判断是否连接只好在CONNECT事件中处理;
procedure TForm2.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add('登录成功');
EdtName.Enabled:=False;
// ClientSocket1.Socket.SendText('UserName:'+EdtName.Text);
end;
至于你的CONNECT[0],通常用于服务器的多线连接;
ServerSocket1.Socket.Connections[LinkCount-1].SendText();
而客户端用ClientSocket1.Socket.SendText()就可以了;
 
哦,这个问题我也发现了,没有什么好办法了码?
 
问题在于ClientType的取值,它的取值决定套接字的读写是同步还是异步。
1、如果取值为ctNonBlocking,则为异步模式(非阻塞),Active:=True之后,
产生一个连接的动作,至于连接何时完成,要看OnConnect事件什么时候产生;
2、如果取值为ctBlocking,则为同步模式(阻塞),Active:=True之后,产生
一个连接的动作,而且会一直等到动作完成之后才会返回。
你取的值是ctNonBlocking,当然看到的Acitve值为False,因为连接还没有完
成,在OnConnect事件看ClientSocket.Active,成功的话会变成True状态的。
 
没什么好方法。
你只有在OnConnect事件中发送第一条信息,比如握手或自报家门;
后面的通讯在ONREAD中处理;

否则不合理,也会出问题;
 
多人接受答案了。
 
uses winsock;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
MainClientSocket := TClientSocket.Create(Nil);
MainClientSocket.Active := False;
MainClientSocket.Address := ServerAddress;
MainClientSocket.Port := ServerPort;
MainClientSocket.ClientType := ctNonBlocking;
MainClientSocket.Active := True;
FD_ZERO(FDSet);
FD_SET(MainClientSocket.socket.SocketHandle, FDSet);
TimeVal.tv_sec := 5; //设置超时(秒)
if select(0, nil,@FDSet,nil, @TimeVal)>0 then
begin
if MainClientSocket.Active then
showmessage('ok');
end;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
563
import
I
后退
顶部