关于IdTCPClient1接收数据的问题。 ( 积分: 200 )

  • 主题发起人 主题发起人 mayi
  • 开始时间 开始时间
M

mayi

Unregistered / Unconfirmed
GUEST, unregistred user!
发送代码:
IdTCPClient1.Host := '127.0.0.1';
IdTCPClient1.Port := 80;
IdTCPClient1.Connect;
IdTCPClient1.WriteBuffer(ms,ms.Size, true);
发送数据之后,是用IdTCPClient1.ReadBuffer(mp.memory^,mp.Size);接收数据吗?可是用这段代码后,就死机了,程序没响应,怎么解决呢? 分不够可以增加。说明一下服务端是其它的网络软件服务器,不是用IdTCPServer做的。我用Iris来载取数据,已知道发送成功,而且服务器也返回信息了,但用IdTCPClient1.ReadBuffer(mp.memory^,mp.Size);就是接收不到,怎么才能接收呢?
 
发送代码:
IdTCPClient1.Host := '127.0.0.1';
IdTCPClient1.Port := 80;
IdTCPClient1.Connect;
IdTCPClient1.WriteBuffer(ms,ms.Size, true);
发送数据之后,是用IdTCPClient1.ReadBuffer(mp.memory^,mp.Size);接收数据吗?可是用这段代码后,就死机了,程序没响应,怎么解决呢? 分不够可以增加。说明一下服务端是其它的网络软件服务器,不是用IdTCPServer做的。我用Iris来载取数据,已知道发送成功,而且服务器也返回信息了,但用IdTCPClient1.ReadBuffer(mp.memory^,mp.Size);就是接收不到,怎么才能接收呢?
 
去看indy自己带的demos,应该一个是IdTCPClient,另外一个是IdTCPServer吧。
 
我看了indy例子,但解决不了。因为服务端不是用IdTCPServer做的,是其它的网络软件,我只是用IdTCPClient发它的服务器发送数据,数据是发送出去了,用Iris软件截取数据,服务器也返回数据了,但我用IdTCPClient1.ReadBuffer(mp.memory^,mp.Size);就是接收不到,而且还死机,程序没响应了。
 
你的ReadBuffer写在什么事件里?建议看看Depth In Indy这本书.
 
tcpclient从tcpserver接收数据,必须用线程
设置
IdTCPServer1.DefaultPort := 10001;
IdTCPServer1.Active := True;

IdTCPClient1.Host := '服务端地址'
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect

1. 客户端发送:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.WriteLn('ok');
end;

2. 服务端接收:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
s: string;
begin
s := AThread.Connection.ReadLn;
end;


3.. 客户端接收数据:(用线程;)

TReceiveThread = class(TThread)
private
FMsg: string;
protected
procedure Execute; override;
end;

var
FThread: TReceiveThread;
procedure TReceiveThread.Execute;
begin
while not Terminated do
begin
if Form1.IdTCPClient1.Connected then
begin
FMsg := Form1.IdTCPClient1.ReadLn;
Sleep(100);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TReceiveThread.Create(False);
IdTCPClient1.Host := Edit1.Text;
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect;
end;

2. 服务端发送数据
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i : Integer;
AThread : TIdPeerThread;
begin
try
with IdTCPServer1.Threads.LockList do
for I := 0 to Count - 1 do
begin
AThread := Items;
if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then
AThread.Connection.WriteLn(s);
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
end;

这个问题多人,早就讨论过[:D][:D]
 
朋友们,我已经说得很清楚了,服务端不是用IdTcpServer做的,也不是我做的,是其它的应用软件的服务端。尝试过用线程接收,也一样收不到数据。
IdTCPClient1.Host := '127.0.0.1';
IdTCPClient1.Port := 80;
IdTCPClient1.Connect;
IdTCPClient1.WriteBuffer(ms,ms.Size, true);
IdTCPClient1.ReadBuffer(mp.memory^,mp.Size);//在这里接收,死机,没响应。
 
先分析包的自定义,得到这次服务器发送包的长度Y
while Y>0 do//H这次接收包的长度(字节数),有可能服务器传送的包很大,客户端要多次接收
begin
try
H:=IdTCPClient1.ReadFromStack(true,1000,true);//超时设置1秒
except
...
end;
IdTCPClient1.ReadBuffer(mp.memory^,H);
Y:=Y-H;
Inc(mp.memory,H);//指针下移H字节


end;
 
mp 是memorystream么? 使用之前定义长度了没(SetSize)?
 
先分析包的自定义,得到这次服务器发送包的长度Y
while Y>0 do//H这次接收包的长度(字节数),有可能服务器传送的包很大,客户端要多次接收
var
revbuffer:array[0..1023] of byte;
mp:PByte;
begin
mp:=@revbuffer;
try
H:=IdTCPClient1.ReadFromStack(true,1000,true);//超时设置1秒
except
...
end;
IdTCPClient1.ReadBuffer(mp,H);
Y:=Y-H;
Inc(mp,H);//指针下移H字节


end;
 
这样应该能解决

var msgBuffer:array[0..2047]of Byte; msgLength,i:Integer;
msgLength:=Form1.myClient.Socket.Recv(msgBuffer,SizeOf(msgBuffer));//此处的msgLength就是此次接收到的实际长度
if msgLength<1 then
Form1.myClient.ReadBuffer(msgBuffer,5)//此处是为了避免msgLength=0的情况
else begin
recvStr:='';
for i:=0 to msgLength do
recvStr:=recvStr+Char(msgBuffer);//把收到的Byte型数据转换为String
end;
memo1.lines.add(recvStr);
 
后退
顶部