关于Idtcpserver和Idtcpclient问题,高手给看一下,解决了另加分。(5分)

  • 主题发起人 主题发起人 cuit421
  • 开始时间 开始时间
C

cuit421

Unregistered / Unconfirmed
GUEST, unregistred user!
程序实现客户端发送一副图片到服务端。程序如下:
客户端
procedure TForm1.BitBtn1Click(Sender: TObject);
var
tem:Tmemorystream;
begin
idtcpclient1.Host:=edit1.Text;
tem:=tmemorystream.Create;
image1.Picture.Graphic.SaveToStream(tem);
idtcpclient1.Connect();
idtcpclient1.WriteStream(tem);
idtcpclient1.Disconnect; //问题所以????????
end;

服务端
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
t:Tmemorystream;
myjpg:tjpegimage;
begin
myjpg:=tjpegimage.Create;
t:=tmemorystream.Create;
athread.Connection.ReadStream(t,-1,true);
t.Position:=0;
myjpg.LoadFromStream(t);
image1.Picture.Bitmap.Assign(myjpg);
end;
以上程序正常
问题是客户端必须发送完后加一句idtcpclient1.Disconnect;如果不加就不能正常接收到,不知是什么原因?高手给讲讲。我想实现的是,连接一次后传输几次图片后再断口,省的每次都连接。
 
idtcpclient1.WriteStream(tem);
idtcpclient1.Disconnect; //问题所以????????
end;

writestream之后不是马上就能发出去的.如果非要这样,加上
while true do
begin
sleep(1);
application.processmessage;
end;
 
可能我说的不太明白,我是指服务器端无法接收到正确的数据,即便延时也不行。
 
你在client中都把连接断掉了,服务器自然无法收到.
你可以安装commview来截一下包看看是否已经正确发送出去了。

其实要断开连接大可以在服务器端收到数据后主动去断开.
 
大哥,给看清楚一些,我是说加上断开连接就能正常接收,不加就不能正常接收啊!你给测试一下就知道了
 
不好意思看错了,如果用writebuffer会怎么样?
 
你就每次连接一次吧,否则总会在 athread.Connection.ReadStream(t,-1,true);停下来等待。或者,你模仿indy的demo,使用线程的方式。
 
发送完,由服务器发一个完成来关闭,不要客户端关闭
 
还有你的图片很大的可以码?
 
to zywcd:
你说的不错,确实是这种情况,如果我强制执行又出错,不知大哥说的线程方式是怎么回事,我这找不到demo,麻烦给发一个,谢谢!
to goddy:
服务端断开应该是一样的,我是不想断开,图片大了也可以,我是了4M的没问题。
 
我是说由服务器发一个命令到客户端来断开
 
to goddy
服务器这边读不到正确的 数据,怎么能断开啊
 
都看不到你的邮件地址。
你在这里自己下载吧 ,很完整的demo.
http://www.tomore.com/1/6702.html
 
虽然达不到我要求的效果,还是感谢各位的回答,特别是zywcd富翁,以后还请多多指教
 
后退
顶部