RecvStream.cpp
上传用户:may_ontech
上传日期:2007-01-08
资源大小:308k
文件大小:3k
源码类别:

图形图象

开发平台:

C++ Builder

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <jpeg.hpp>
  4. #pragma hdrstop
  5. #include "RecvStream.h"
  6. #include "ChildWin.h"
  7. #include "Socket.cpp"
  8. #include "Ping.cpp"
  9. #pragma package(smart_init)
  10. //---------------------------------------------------------------------------
  11. //   Important: Methods and properties of objects in VCL can only be
  12. //   used in a method called using Synchronize, for example:
  13. //
  14. //      Synchronize(UpdateCaption);
  15. //
  16. //   where UpdateCaption could look like:
  17. //
  18. //      void __fastcall TRecvStreamThread::UpdateCaption()
  19. //      {
  20. //        Form1->Caption = "Updated in a thread";
  21. //      }
  22. //---------------------------------------------------------------------------
  23. __fastcall TRecvStreamThread::TRecvStreamThread(bool CreateSuspended)
  24.         : TThread(CreateSuspended)
  25. {
  26. }
  27. //---------------------------------------------------------------------------
  28. bool __fastcall TRecvStreamThread::LoadImage(TImage *Image1)
  29. {
  30. CPingReply reply;
  31. CPing PingHost;
  32. bool bRtn = false;  // 函数返回值初始为FALSE
  33. StatusBar->SimpleText = "正在连接主机...";
  34. // 先PING主机,检测网络是否畅通
  35. bool rtn = PingHost.Ping(RemoteAddress.c_str(),reply,64,4000,32);
  36. if (rtn) {
  37. u_short RecvPort=0;
  38. int RecvSocket = BindSocket(&RecvPort);  // 动态分配接收端口
  39. if (RecvSocket) {
  40. // 将接收端口和色深、图象品质合成一条命令,参数之间以'n'分隔
  41. AnsiString Msg = IntToStr(RecvPort) + "n" +
  42. IntToStr(CL) + "n" +
  43. IntToStr(CQ) + "n";
  44. // 向远程主机发送命令
  45. if (SendMsg(RemoteAddress,LISTENPORT,Msg)) {
  46. TMemoryStream *Stream;
  47. try {
  48. // 定义一个数据流并分配内存
  49. Stream = new TMemoryStream;  
  50. StatusBar->SimpleText = "正在接收数据...";
  51. Application->ProcessMessages();  // 处理系统消息
  52. // 开始接收图象到数据流中
  53. if (RecvStream(RecvSocket,Stream)) {
  54. TJPEGImage *jpeg;  // 定义JPEG图象
  55. try {
  56. jpeg = new TJPEGImage;  // 分配内存
  57. // 从数据流中载入图象
  58. jpeg->LoadFromStream(Stream);  
  59. // 显示图象
  60. Image1->Picture->Bitmap->Assign(jpeg);  
  61. MessageBeep(MB_OK);  // 发出提示声音
  62. // 返回值为TRUE,表示成功
  63. bRtn = true;  
  64. }
  65. __finally {
  66. delete jpeg;  // 释放资源
  67. }
  68. }
  69. else
  70. MessageBox(0,"接收数据流失败","冰河",MB_ICONERROR);
  71. }
  72. __finally {
  73. delete Stream;  // 释放资源
  74. }
  75. }
  76. else
  77. MessageBox(0,("无法与主机'"+ RemoteAddress +"'建立连接").c_str(),
  78. "冰河",MB_ICONERROR);
  79. }
  80. else
  81. MessageBox(0,"分配端口失败,无法继续接收数据","冰河",MB_ICONERROR);
  82. }
  83. else
  84. MessageBox(0,("主机'"+RemoteAddress+"'没有响应").c_str(),"冰河",MB_ICONERROR);
  85.     
  86. return bRtn;
  87. }
  88. void __fastcall TRecvStreamThread::Execute()
  89. {
  90.         //---- Place thread code here ----
  91. if (LoadImage(RemoteScreen))
  92. StatusBar->SimpleText = "数据接收完毕";
  93. else
  94. StatusBar->SimpleText = "接收数据失败";
  95. }
  96. //---------------------------------------------------------------------------