读书人

idTCPClient无法接收数据

发布时间: 2012-04-24 14:15:38 作者: rapoo

求救,idTCPClient无法接收数据
我用idTCPClient做客户端,连接单片机服务器,idTCPClient只能发送数据却收不到数据,用网络调试器做服务器也接收不到数据。但我用idTCPServer做服务器端就是好的,XDJM们帮帮忙,我单片机不能用idTCPServer做服务器啊,但基于项目兼容性,客户端又必须用idTCPClient。
问题详述下:
idTCPClient发给其他服务器能收到。
其他服务器发给idTCPClient的数据收不到。非阻塞方式。

[解决办法]

Delphi(Pascal) code
这是我以前写过的一个为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在服务环境里只能发包,不能收包

读书人网 >.NET

热点推荐