我用TClientSocket写了一个CLIENT端的程序,在选择用非阻塞方式(ctNoBlocking)连接SERVER端时如果失败,可以激发ClientSockError事件,不会产生异常,但是这种方式传送数据好象不可靠.要是选择阻塞方式(ctBlocking)在连接SERVER端失败时就会产生异常,而不激发ClientSockError事件,如何处理或者避免该异常的产生?
解决方案 »
- 【上海求职】Delphi 程序员
- 问一个外部发邮件的问题
- 如何实现?在线等待,急(先给十分,解决后再加,不食言!!!)
- 如何限定程序的使用时间,比如一个程序使用10天后,必须输入序列号,才能再使用!
- Outlook := CreateOleObject('OutlookExpress.Application'),却提示连接错误,怎么回事?
- 字符串处理
- 考倒斑竹~~高手必看 给分100
- 大家帮助,写个SQL语句---修改表字段
- 怎样能监听在使用的网络端口,并且能进行拦截
- 在SQL SERVER 的数据库设计期,可以修改表中某个字段的名称或删除这个字段,如何在程序中做到这一点呢,用什么语句?
- 鼠标经过button的事件是OnMouseMove,求鼠标离开的事件或能解决此问题的代码
- 各位大侠们,帮帮我吧!一个关于类型文件的存取问题!小弟好痛苦啊~~~~谢谢大家了!!!
Active := True;
Except
错误处理
end;
还有那种异常处理我也试过,不起作用,还是出现异常,不知何故?
如果你分析过socket api那你就知道他可不可靠。
其实,阻塞方式采用的钩子时也是设置为非阻塞状态来接收或取得连接的,然后再设置回来的。
非阻塞传输是很可靠的。而阻塞不在很正规(如手机通信等大型)的系统上,还是最好不要用。
var
Data: array[0..1023] of char;
SocketStream: TWinSocketStream;
ADOQuery: TADOQuery;
ADOConnection: TADOConnection;
t:_Recordset;
ReceiveMessage :String;
begin
Synchronize(RegisterForm);
SocketStream := TWinSocketStream.Create(ClientSocket, 600000);
while not Terminated and ClientSocket.Connected do
try
FillChar(Data, SizeOf(Data), 0);
if SocketStream.Read(Data, SizeOf(Data)) = 0 then
begin
ClientSocket.Close;
Synchronize(RemoveForm);
Terminate;
end;
ReceiveMessage := Data;
Send(ReceiveMessage);
except
ClientSocket.Close;
Synchronize(RemoveForm);
Terminate;
end;
end;