求救,idTCPClient无法接收数据
我用idTCPClient做客户端,连接单片机服务器,idTCPClient只能发送数据却收不到数据,用网络调试器做服务器也接收不到数据。但我用idTCPServer做服务器端就是好的,XDJM们帮帮忙,我单片机不能用idTCPServer做服务器啊,但基于项目兼容性,客户端又必须用idTCPClient。
问题详述下:
idTCPClient发给其他服务器能收到。
其他服务器发给idTCPClient的数据收不到。非阻塞方式。
[解决办法]
这是我以前写过的一个为idtcpclient添加接收数据线程的一个组件,你新建一个package,把这个文件加入进去,然后编译安装,在你的组件面板里面会出现一个ldx组件页,使用里面的TLdxTCPClient组件里的DataAvailable事件,看看效果吧,good luck!unit LdxTCPClient;interfaceuses Classes, SysUtils, IdGlobal, IdStack, IdTCPClient, IdTCPConnection;type TTCPClientReader = class; TLdxTCPClient = class(TIdTCPClient) private FTCPClientReader: TTCPClientReader; FOnDataAvailable: TNotifyEvent; procedure DoDataAvailableEvent; public procedure Connect(const ATimeout: Integer = IdTimeoutDefault); override; procedure Disconnect; override; published property OnDataAvailable: TNotifyEvent read FOnDataAvailable write FOnDataAvailable; end; TTCPClientReader = class(TThread) protected FTCPClient: TLdxTCPClient; InpLastSize: Integer; public constructor Create(LdxTCPClient: TLdxTCPClient); procedure Execute; override; end; procedure Register;implementation{ TTCPClient }procedure TLdxTCPClient.Connect(const ATimeout: Integer);begin inherited Connect(ATimeout); if Connected then FTCPClientReader := TTCPClientReader.Create(Self);end;procedure TLdxTCPClient.Disconnect;begin if Assigned(FTCPClientReader) then FTCPClientReader.Terminate; inherited Disconnect;end;procedure TLdxTCPClient.DoDataAvailableEvent;begin if Assigned(FOnDataAvailable) then FOnDataAvailable(Self);end;{ TTCPClientReader }constructor TTCPClientReader.Create(LdxTCPClient: TLdxTCPClient);begin inherited Create(False); InpLastSize := 0; FTCPClient := LdxTCPClient; FreeOnTerminate := True;end;procedure TTCPClientReader.Execute;var InpSize: Integer;begin while (not Terminated) and (FTCPClient.Connected) do begin try InpSize := FTCPClient.InputBuffer.Size; if (InpSize = 0) or (InpSize = InpLastSize) then InpLastSize := InpSize + FTCPClient.ReadFromStack(False, -1, False); FTCPClient.CheckForDisconnect(False, True); if FTCPClient.Connected then Synchronize(FTCPClient.DoDataAvailableEvent); except if FTCPClient.Connected then FTCPClient.Disconnect; Terminate; end; end;end;procedure Register;BEGIN RegisterComponents('LDX',[TLdxTCPClient]);END;end.
[解决办法]
你自己写个简单的SOCKET测试下就知道了,估计有可能是INDY的问题
以前碰到过INDY的IDUDPSERVE在服务环境里只能发包,不能收包