IdTCPClient中memorystream 的接收问题!急+郁闷!一晚上没折腾出来!(indy9)
2010-08-31 22:15
295 查看
来源:http://topic.csdn.net/t/20041111/00/3541598.html
idTCPClient中memorystream 的接收问题!急+郁闷!一晚上没折腾出来!
ms: Tmemorystream;
Server端:
AThread.Connection.WriteStream(ms,true,true);
Client端:
IdTCPClient1.ReadStream(ms, -1, True);
为什么Client端停在这行就不动了 ?
我用wpe查看 数据已经过来了!
这里是不是必须判断MS的长度?
测试了几种参数都是阻塞到这就完了!搜索了一下也没找到答案!
那位给个例子 郁闷死了。。。。
如果是没有断开的情况你在客户端read的,把第三个参数设置为true的话,第二个参数设置为你传输stream的大小。
可以这样修改:
Server端:
AThread.Connection.WriteInteger(ms.size); //先发送大小;
AThread.Connection.WriteStream(ms,true,true);
Client端:
size := IdTCPClient1.ReadInteger; //先读取大小。
IdTCPClient1.ReadStream(ms, size , False);
还有一个方法是,不发送大小,客户端读取buffer的大小,但是我没有试验成功。楼主可以试试。
Server端:
AThread.Connection.WriteStream(ms,true,true);
Client端:
size := IdTCPClient1.InputBuffer.Size; //先读取大小。
IdTCPClient1.ReadStream(ms, size , False);
在服务端发送完毕后,关掉连接,客户端的ReadStream就会返回(不然就会停在那里,一直等待读取,当然指定流的长度也是一样的道理)。
Server端:
AThread.Connection.OpenWriteBuffer;
AThread.Connection.WriteStream(ms,true,true);
AThread.FlushBuffer;
AThread.Connection.CloseWriteBuffer;
Client端:
IdTCPClient1.ReadStream(ms, -1, False);
酱紫……
如果是断开的情况,用 WGYKING(修罗是谁?!) 的方法可以,
不断开还是要先接收大小。
定义如下:
type
ARecord = packed record
Command : Integer;
Content : String[30];
end;
var
CommBlock : ARecord;
服务端:
procedure TForm1.IdTCPServer1Exception(AThread: TIdPeerThread;
AException: Exception);
var
ms : TMemoryStream;
begin
ms := TMemoryStream.Create;
try
CommBlock.Command := 4003;
CommBlock.Content := 'Test ReadStream';
ms.WriteBuffer(CommBlock, sizeof(CommBlock));
AThread.Connection.WriteInteger(ms.Size); //先发送大小
AThread.Connection.OpenWriteBuffer;
try
AThread.Connection.WriteStream(ms);
AThread.Connection.CloseWriteBuffer;
except
AThread.Connection.CancelWriteBuffer;
end;
finally
FreeAndNil(ms);
end;
end;
客户端:用timer控件读取,Interval=500,也可以用线程。
procedure TForm1.Timer1Timer(Sender: TObject);
var
ms : TMemoryStream;
size : Integer;
begin
if not IdTCPClient1.Connected then Exit;
ms := TMemoryStream.Create;
try
size := IdTCPClient1.ReadInteger; //先读取大小。
if size = 0 then
begin
FreeAndNil(ms);
Exit;
end;
IdTCPClient1.ReadStream(ms, size, True);
ms.Position := 0;
ms.ReadBuffer(CommBlock, sizeof(CommBlock));
RichEdit1.Lines.Add(IntToStr(CommBlock.Command));
RichEdit1.Lines.Add(CommBlock.Content);
finally
FreeAndNil(ms);
end;
end;
其它的设置你自己应该能够搞定,如果还不可以,留下mail我把这个例子发给你。
注意:
服务端:
ms.WriteBuffer(CommBlock, sizeof(CommBlock));
//AThread.Connection.WriteInteger(ms.Size); //先发送大小
AThread.Connection.OpenWriteBuffer;
try
AThread.Connection.WriteStream(ms, True, True); //和上面的区别,如果这样,上面发送大小就不要了。
AThread.Connection.CloseWriteBuffer;
except
AThread.Connection.CancelWriteBuffer;
end;
finally
FreeAndNil(ms);
搞成这才正常接收为什么? IdTCPClient1.ReadStream(ms, Size, False);
idTCPClient中memorystream 的接收问题!急+郁闷!一晚上没折腾出来!
ms: Tmemorystream;
Server端:
AThread.Connection.WriteStream(ms,true,true);
Client端:
IdTCPClient1.ReadStream(ms, -1, True);
为什么Client端停在这行就不动了 ?
我用wpe查看 数据已经过来了!
这里是不是必须判断MS的长度?
测试了几种参数都是阻塞到这就完了!搜索了一下也没找到答案!
那位给个例子 郁闷死了。。。。
如果是没有断开的情况你在客户端read的,把第三个参数设置为true的话,第二个参数设置为你传输stream的大小。
可以这样修改:
Server端:
AThread.Connection.WriteInteger(ms.size); //先发送大小;
AThread.Connection.WriteStream(ms,true,true);
Client端:
size := IdTCPClient1.ReadInteger; //先读取大小。
IdTCPClient1.ReadStream(ms, size , False);
还有一个方法是,不发送大小,客户端读取buffer的大小,但是我没有试验成功。楼主可以试试。
Server端:
AThread.Connection.WriteStream(ms,true,true);
Client端:
size := IdTCPClient1.InputBuffer.Size; //先读取大小。
IdTCPClient1.ReadStream(ms, size , False);
在服务端发送完毕后,关掉连接,客户端的ReadStream就会返回(不然就会停在那里,一直等待读取,当然指定流的长度也是一样的道理)。
Server端:
AThread.Connection.OpenWriteBuffer;
AThread.Connection.WriteStream(ms,true,true);
AThread.FlushBuffer;
AThread.Connection.CloseWriteBuffer;
Client端:
IdTCPClient1.ReadStream(ms, -1, False);
酱紫……
如果是断开的情况,用 WGYKING(修罗是谁?!) 的方法可以,
不断开还是要先接收大小。
定义如下:
type
ARecord = packed record
Command : Integer;
Content : String[30];
end;
var
CommBlock : ARecord;
服务端:
procedure TForm1.IdTCPServer1Exception(AThread: TIdPeerThread;
AException: Exception);
var
ms : TMemoryStream;
begin
ms := TMemoryStream.Create;
try
CommBlock.Command := 4003;
CommBlock.Content := 'Test ReadStream';
ms.WriteBuffer(CommBlock, sizeof(CommBlock));
AThread.Connection.WriteInteger(ms.Size); //先发送大小
AThread.Connection.OpenWriteBuffer;
try
AThread.Connection.WriteStream(ms);
AThread.Connection.CloseWriteBuffer;
except
AThread.Connection.CancelWriteBuffer;
end;
finally
FreeAndNil(ms);
end;
end;
客户端:用timer控件读取,Interval=500,也可以用线程。
procedure TForm1.Timer1Timer(Sender: TObject);
var
ms : TMemoryStream;
size : Integer;
begin
if not IdTCPClient1.Connected then Exit;
ms := TMemoryStream.Create;
try
size := IdTCPClient1.ReadInteger; //先读取大小。
if size = 0 then
begin
FreeAndNil(ms);
Exit;
end;
IdTCPClient1.ReadStream(ms, size, True);
ms.Position := 0;
ms.ReadBuffer(CommBlock, sizeof(CommBlock));
RichEdit1.Lines.Add(IntToStr(CommBlock.Command));
RichEdit1.Lines.Add(CommBlock.Content);
finally
FreeAndNil(ms);
end;
end;
其它的设置你自己应该能够搞定,如果还不可以,留下mail我把这个例子发给你。
注意:
服务端:
ms.WriteBuffer(CommBlock, sizeof(CommBlock));
//AThread.Connection.WriteInteger(ms.Size); //先发送大小
AThread.Connection.OpenWriteBuffer;
try
AThread.Connection.WriteStream(ms, True, True); //和上面的区别,如果这样,上面发送大小就不要了。
AThread.Connection.CloseWriteBuffer;
except
AThread.Connection.CancelWriteBuffer;
end;
finally
FreeAndNil(ms);
搞成这才正常接收为什么? IdTCPClient1.ReadStream(ms, Size, False);
相关文章推荐
- eclipse中某工程的断点进不去问题,折腾了N个小时才找到原因,郁闷
- 瞎折腾出来的问题
- 阻止子元素继承父元素事件(郁闷我一晚上的问题!)
- 好久好久没有犯粗心的问题了,好象有错误都是找一会就出来了,但是这个错误我就郁闷了 老有KERN-EXEC3 错误 找了好久 郁闷啊
- 刚注册,问个问题,在asp.net里有个xml文档以MemoryStream存在资源文件中,现在我如何把他读出来,还原成xml文档。
- eclipse中某工程的断点进不去问题,折腾了N个小时才找到原因,郁闷
- 周末发现一个BUG,时有时无,一出程序就崩溃,郁闷了好久,终于跟出来来了,记之,提醒自己今后一定规范编写,只要规范,绝对不会出问题
- ajax接收java后台传过来的json数据乱码及获取字段undefind问题
- 提交表单乱码问题 action 中文接收的参数乱码
- 对于多对一关联的时候使用JSON方式显示不出来的问题
- [.net training]代码cnBlogsGuestBook 1.0中展示出来的问题
- 比较郁闷的问题
- [PHP]不同操作系统下PHP接收POST数据问题
- 关于用Foxmail接收Exchange邮件服务器问题
- Ext出来个3.0.1版本,不过不能免费下载了,郁闷
- UDP 协议 C# UdpClient乱序接收数据包丢失的问题 Socket ReceiveBufferSize
- 关于springmvc怎么完成中文字符的接收问题
- android 小问题 - android设置弹出软键盘却没有弹出来
- android.intent.action.BOOT_COMPLETED 被延迟接收问题
- 郁闷的日子1--关于XP和2003server双系统的问题