CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  网络通信/分布式开发

serversocket 和 clientsocket 怎样传自定义类型数据?

楼主wujunliang(亮)2004-03-01 19:18:51 在 Delphi / 网络通信/分布式开发 提问

传输模式为非阻塞,stThreadBlocking,ctNonBlocking  
  以下代码实现文件传输,如何传输自定义数据呢?  
   
  -----------------Client----------------------  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   ScktComp;  
   
  type  
      TForm1   =   class(TForm)  
          ClientSocket1:   TClientSocket;  
          OpenDialog1:   TOpenDialog;  
          Button1:   TButton;  
          procedure   Button1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      s   :   TWinSocketStream;  
      f,   f2:   TFileStream;  
  begin  
      if   not   OpenDialog1.Execute   then   Exit;  
      ClientSocket1.Open;  
      s   :=   TWinSocketStream.Create(ClientSocket1.Socket,   60000);  
      f   :=   TFileStream.Create(OpenDialog1.FileName,   fmShareDenyWrite);  
      try  
          s.CopyFrom(f,   0);  
      finally  
          s.Free;  
          f.Free;  
          ClientSocket1.Close;  
      end;  
  end;  
   
  end.  
  -----------------Server---------------------  
  unit   Unit2;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   ScktComp;  
   
  type  
      TForm1   =   class(TForm)  
          ServerSocket1:   TServerSocket;  
          procedure   ServerSocket1GetThread(Sender:   TObject;  
              ClientSocket:   TServerClientWinSocket;  
              var   SocketThread:   TServerClientThread);  
          private  
          {   Private   declarations   }  
          public  
          {   Public   declarations   }  
          end;  
      TClientThread   =   Class(TServerClientThread)  
          private  
          public  
          procedure   ClientExecute;   override;  
          end;  
           
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
   
  procedure   TClientThread.ClientExecute;  
  var  
      ReceiveBuffer   :   Array[0..1023]   Of   Char;  
      SocketStream   :   TWinSocketStream;  
      BytesRead   :   Integer;  
      F   :   TFileStream;  
      FileName:   string;  
  begin  
    while   not   Terminated   and   ClientSocket.Connected   do  
      Begin  
        try  
            SocketStream   :=   TWinSocketStream.Create(ClientSocket,   100);  
            FileName   :=   'C:\afile';  
            if   FileExists(FileName)   then   FileName   :=   FileName   +   '0';  
            F   :=   TFileStream.Create(FileName,   fmCreate);  
            try  
                FillChar(ReceiveBuffer,   sizeof(ReceiveBuffer),   0);  
                  while   SocketStream.WaitForData(5000)   do  
                  begin  
                      BytesRead   :=   SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));  
                      if   BytesRead   =   0   then  
                          ClientSocket.Close  
                      Else  
                        F.WriteBuffer(ReceiveBuffer,   BytesRead);  
                  end;  
            finally  
                SocketStream.Free;  
                ClientSocket.Close;  
                f.Free;  
            end;  
        except  
        end;  
      end;  
  end;  
   
   
  procedure   TForm1.ServerSocket1GetThread(Sender:   TObject;  
      ClientSocket:   TServerClientWinSocket;  
      var   SocketThread:   TServerClientThread);  
  begin  
      SocketThread   :=   TClientThread.Create(False,   ClientSocket);  
  end;  
   
  end.  
  问题点数:20、回复次数:5Top

1 楼czx0514(不想再做那份工作)回复于 2004-03-17 13:01:08 得分 0

不是很熟悉,顶一下Top

2 楼idealistt(风过)回复于 2004-03-17 13:02:53 得分 20

在while的free前里写代码Top

3 楼orber(破烂的)回复于 2004-03-18 04:27:41 得分 0

"传输模式为非阻塞,stThreadBlocking,ctNonBlocking"  
   
  看你的源程序明明是阻塞模式啊.  
   
  握手规范还是要在建立了线程以后,在线程中来写.  
   
  SocketStream.Read(Data,   SizeOf(Data))  
  if   data   =   'Ready?'   then  
  begin  
          ClientSocket.SendText('ok');  
  end;  
   
  Top

相关问题

  • ServerSocket和ClientSocket发自定义信息问题?
  • 自定义数据类型
  • 一个自定义类型
  • 怎么办:自定义类 + 自定义类型
  • 关于自定义变量类型
  • 自定义数据类型的问题?
  • 用户自定义类型未找到?
  • 如何自定义数据类型?
  • 自定义类型的问题 ,急!
  • 自定义类型和Error两问。

关键词

  • 模式
  • clientsocket
  • receivebuffer
  • socketstream
  • serversocket
  • socketthread
  • tclientthread
  • twinsocketstream
  • tform
  • tfilestream

得分解答快速导航

  • 帖主:wujunliang
  • idealistt

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo