我就是这样做的, DMMainDate.sctClient.Address := ledtIPAddress.Text; DMMainDate.sctClient.Port := StrToInt(ledtPort.Text); DMMainDate.sctClient.Open; //写入配置文件 if DMMainDate.sctClient.Active then //但是这句,每次都是False;无论我设置是否正确 begin DataCfgIniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'DataCfg.ini'); DataCfgIniFile.WriteString('DataCfgOption', 'IPAddress', ledtIPAddress.Text); DataCfgIniFile.WriteInteger('DataCfgOption', 'Port', StrToInt(ledtPort.Text)); DataCfgIniFile.Free; DMMainDate.strIPAddress :=ledtIPAddress.Text; DMMainDate.intPort :=StrToInt(ledtPort.Text); Close(); end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin showmessage('连接已断开'); end;procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin showmessage('连接是否成功'); end;
if DMMainDate.sctClient.Active then //但是这句,每次都是False;无论我设置是否正确//不会吧?我试了下。没问题呀? if ClientSocket1.Active then showmessage('true')else showmessage('false')
if DMMainDate.sctClient.Active then //但是这句,每次都是False;无论我设置是否正确
ClientSocket1.open 这个函数的返回值就是是否成功
To antivence(铁丝面) ClientSocket1.open 根本就是一个procedure,没有返回值
To myling(阿德): 我在其间没有做其他操作,我的意思是在进行DMMainDate.sctClient.Open;的时候,程序已经开始运行下面的语句了。所以我的程序if DMMainDate.sctClient.Active then 中的Active值一直是False。
我寫了一個Connect的函數﹕function TTLWallySmtp.Connect (var vErrStr: string; bLeaseLine: Boolean): integer; begin Try if not bLeaseLine then if not CheckSocketAvail then raise Exception.Create('Remote connection not available'); Open; repeat Application.ProcessMessages; if FFlag = False then Break; until Socket.Connected; RecvText; SendText('HELO ' + 'INeedYou' + CRLF); // SendText('HELO ' + Socket.LocalHost + CRLF); RecvText; if FVerify then begin SendText('auth LOGIN' +CRLF); RecvText; SendText(Base64Encode(FUser) +CRLF); RecvText; SendText(Base64Encode(FPass) +CRLF); end; result := 0; Except On E : Exception do begin vErrStr := E.Message; result := -1; if Socket.Connected then Socket.Close; end; End; end;------------------------------------------------------------------------ procedure TTLWallySmtp.RecvText; var r, i: Integer; s: string; buf: array[0..1023] of Char; ReplyCode, ReplyStr: string; begin ReplyCode := ''; ReplyStr := ''; i := 0; Repeat Application.ProcessMessages; r := Socket.ReceiveBuf( buf, SizeOf(buf)); s := copy( buf, 1, r); ReplyCode := trim( copy( s, 1, 4)); ReplyStr := trim( copy( s, 5, pos( CRLF, s) -5)); i := i+1; until ((ReplyCode <> '') or (i>10)); if ReplyCode <> '' then begin // first digit of replycode 2 or 3 indicates success if (ReplyCode[1] <> '2') and (ReplyCode[1] <> '3') then raise Exception.Create(ReplyStr) end else raise Exception.Create('No Reply'); end;
TO foxnt(吴剑明★天马梦想) : 我现在要得有点急,我也是第一次用Socket,不知你能不能帮我写一段原码,分我会给你的。
procedure TForm1.Timer1Timer(Sender: TObject); begin ClientSocket1.Socket.SendText('check'); end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin if Socket.ReceiveText='check' then Socket.SendText('connected'); end;procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin if Socket.ReceiveText='connected' then showmessage('仍然连接') end;Timer1的时间间隔你自己设,1000是一秒
TO myling(阿德) : 就只有这种方法吗?你这种方法不能还是不能及时得到是否连接成功,比如我现在把这个消息发过去后,要等几秒钟才有反应,而程序却已经执行到下一步了。如:我用这种方法在登录时判断是否连接上服务器端,而我已经登录了,才报错。希望大家能帮我想想,我再加200分解决该问题。
你想让他及时到什么地步?一送出去马上响应?这怎么可能?========================================================================= 我用这种方法在登录时判断是否连接上服务器端,而我已经登录了,才报错。 =========================================================================至于你说的这个问题很好办,你可以设置一个变量标志,默认时,设成0,这是程序停止,等待返回值当返回正确是,设成1,程序继续,返回错误时,设成2,程序退出var iserro:integer=0; procedure TForm1.Timer1Timer(Sender: TObject); begin try ClientSocket1.Socket.SendText('check'); except iserro:=2; end; end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin if Socket.ReceiveText='check' then Socket.SendText('connected'); end;procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin if Socket.ReceiveText='connected' then begin iserro:=1; showmessage('仍然连接'); end; end;procedure TForm1.login; begin …… while iserro=0 do begin Application.ProcessMessages; end; if iserro=2 then exit; if iserro=1 then
DMMainDate.sctClient.Port := StrToInt(ledtPort.Text);
DMMainDate.sctClient.Open;
//写入配置文件 if DMMainDate.sctClient.Active then //但是这句,每次都是False;无论我设置是否正确
begin
DataCfgIniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'DataCfg.ini');
DataCfgIniFile.WriteString('DataCfgOption', 'IPAddress', ledtIPAddress.Text);
DataCfgIniFile.WriteInteger('DataCfgOption', 'Port', StrToInt(ledtPort.Text));
DataCfgIniFile.Free;
DMMainDate.strIPAddress :=ledtIPAddress.Text;
DMMainDate.intPort :=StrToInt(ledtPort.Text);
Close();
end;
Socket: TCustomWinSocket);
begin
showmessage('连接已断开');
end;procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('连接是否成功');
end;
if ClientSocket1.Active then showmessage('true')else showmessage('false')
DMMainDate.sctClient.Port := StrToInt(ledtPort.Text);
DMMainDate.sctClient.Open;
//写入配置文件…………//这之间没对sctClient进行操作吗?
if DMMainDate.sctClient.Active then //但是这句,每次都是False;无论我设置是否正确
这个函数的返回值就是是否成功
ClientSocket1.open 根本就是一个procedure,没有返回值
我在其间没有做其他操作,我的意思是在进行DMMainDate.sctClient.Open;的时候,程序已经开始运行下面的语句了。所以我的程序if DMMainDate.sctClient.Active then 中的Active值一直是False。
begin
Try
if not bLeaseLine then
if not CheckSocketAvail then
raise Exception.Create('Remote connection not available');
Open;
repeat
Application.ProcessMessages;
if FFlag = False then
Break;
until Socket.Connected;
RecvText;
SendText('HELO ' + 'INeedYou' + CRLF);
// SendText('HELO ' + Socket.LocalHost + CRLF);
RecvText;
if FVerify then
begin
SendText('auth LOGIN' +CRLF);
RecvText;
SendText(Base64Encode(FUser) +CRLF);
RecvText;
SendText(Base64Encode(FPass) +CRLF);
end;
result := 0;
Except
On E : Exception do
begin
vErrStr := E.Message;
result := -1;
if Socket.Connected then
Socket.Close;
end;
End;
end;------------------------------------------------------------------------
procedure TTLWallySmtp.RecvText;
var
r, i: Integer;
s: string;
buf: array[0..1023] of Char;
ReplyCode, ReplyStr: string;
begin
ReplyCode := '';
ReplyStr := '';
i := 0;
Repeat
Application.ProcessMessages;
r := Socket.ReceiveBuf( buf, SizeOf(buf));
s := copy( buf, 1, r);
ReplyCode := trim( copy( s, 1, 4));
ReplyStr := trim( copy( s, 5, pos( CRLF, s) -5));
i := i+1;
until ((ReplyCode <> '') or (i>10));
if ReplyCode <> '' then
begin
// first digit of replycode 2 or 3 indicates success
if (ReplyCode[1] <> '2') and (ReplyCode[1] <> '3') then
raise Exception.Create(ReplyStr)
end else
raise Exception.Create('No Reply');
end;
其实我的意思是:我每个客户端执行操作后,就向服务器端发送消息,然后服务器端再向每个客户端发送消息,使每个客户端显示的数据都是相同的。所以我要求能及时判断每次发送的消息是否成功。
用控件的事件,有时候不能准确地反应连接状态,这和网络的复杂状况有关。
你可以多参考WINSOCK 的API。如果你能了解API,会发现你的问题只是小儿科了。:)
我现在要得有点急,我也是第一次用Socket,不知你能不能帮我写一段原码,分我会给你的。
begin
ClientSocket1.Socket.SendText('check');
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Socket.ReceiveText='check' then
Socket.SendText('connected');
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Socket.ReceiveText='connected' then
showmessage('仍然连接')
end;Timer1的时间间隔你自己设,1000是一秒
就只有这种方法吗?你这种方法不能还是不能及时得到是否连接成功,比如我现在把这个消息发过去后,要等几秒钟才有反应,而程序却已经执行到下一步了。如:我用这种方法在登录时判断是否连接上服务器端,而我已经登录了,才报错。希望大家能帮我想想,我再加200分解决该问题。
我用这种方法在登录时判断是否连接上服务器端,而我已经登录了,才报错。
=========================================================================至于你说的这个问题很好办,你可以设置一个变量标志,默认时,设成0,这是程序停止,等待返回值当返回正确是,设成1,程序继续,返回错误时,设成2,程序退出var iserro:integer=0;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
try
ClientSocket1.Socket.SendText('check');
except
iserro:=2;
end;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Socket.ReceiveText='check' then
Socket.SendText('connected');
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Socket.ReceiveText='connected' then
begin
iserro:=1;
showmessage('仍然连接');
end;
end;procedure TForm1.login;
begin
……
while iserro=0 do
begin
Application.ProcessMessages;
end;
if iserro=2 then exit;
if iserro=1 then
……
end;