发送数据时有Sendln,SendBuf,SendStream。接收数据时有Receiveln,ReceiveBuf,当时我很奇怪为什么没有ReceiveStream。因为很自然的想到是对应关系的。但当时我不知道,发数据时是一小段一小段地发的

看看SendStream代码:

  1. function TBaseSocket.SendStream(AStream: TStream): Integer;
  2. var
  3. BufLen: Integer;
  4. Buffer: array[0..511] of Byte;
  5. begin
  6. Result := 0;
  7. if Assigned(AStream) then
  8. begin
  9. repeat
  10. BufLen := AStream.Read(Buffer, SizeOf(Buffer));
  11. until (BufLen = 0) or (SendBuf(Buffer, BufLen) = SOCKET_ERROR);
  12. end;
  13. end;

从以上代码可看到,SendStream一次最多发送512字节的内容,所以,我们这接收端循环用ReceiveBuf接收就可以了。不用像以前那样写得又复杂乱。

发送端(Client)代码:

  1. unit Unit1;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls, Sockets;
  6. type
  7. TForm1 = class(TForm)
  8. tcpclnt1: TTcpClient;
  9. btn1: TButton;
  10. procedure btn1Click(Sender: TObject);
  11. private
  12. { Private declarations }
  13. public
  14. { Public declarations }
  15. end;
  16. var
  17. Form1: TForm1;
  18. implementation
  19. {$R *.dfm}
  20. procedure TForm1.btn1Click(Sender: TObject);
  21. var
  22. f : TFileStream;//文件流
  23. i : Integer;
  24. fn : string;//文件名
  25. begin
  26. {用for循环是实现发送多个文件,如果只是发送一个文件,不用循环}
  27. for i := 1 to 11 do
  28. begin
  29. tcpclnt1.Connect; //连接服务端,我把TTcpClient的BlockMode设为bmBlocking
  30. fn := 'a' + IntToStr(i) + '.rar';
  31. f := TFileStream.Create('d:/send/' + fn,fmOpenRead); //用文件流以读方式打开要发送的文件
  32. tcpclnt1.Sendln(fn); //给对方发送文件名
  33. tcpclnt1.Sendln(IntToStr(f.Size)); //给对方发送文件大小
  34. tcpclnt1.SendStream(f); //发送文件流
  35. f.Free;//释放文件流
  36. tcpclnt1.Disconnect;//关闭连接
  37. end;
  38. end;
  39. end.

接收端(Server)代码:

  1. unit Unit1;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, Sockets;
  6. type
  7. TForm1 = class(TForm)
  8. tcpsrvr1: TTcpServer;
  9. procedure FormActivate(Sender: TObject);
  10. procedure tcpsrvr1Accept(Sender: TObject;
  11. ClientSocket: TCustomIpClient);
  12. private
  13. { Private declarations }
  14. public
  15. { Public declarations }
  16. end;
  17. var
  18. Form1: TForm1;
  19. implementation
  20. {$R *.dfm}
  21. procedure TForm1.FormActivate(Sender: TObject);
  22. begin
  23. tcpsrvr1.Open; //在OnActive事件中启动TCPServer的监听
  24. end;
  25. procedure TForm1.tcpsrvr1Accept(Sender: TObject;
  26. ClientSocket: TCustomIpClient);
  27. var
  28. f : TFileStream;  //文件流
  29. iFileSize : Integer; //文件大小
  30. iTotalRec : Integer; //总接收到的字节数,用来和文件大小比较,如果比文件大小的值要小,就还要继续接收
  31. iacRec    : Integer; //每一次ReceiveBuf实际接收到的字节数
  32. pbuf      : Pointer; //缓存指针
  33. i : Integer;
  34. fn : string; //文件名
  35. begin
  36. GetMem(pbuf,512); //我们一次最多也读取512字节
  37. try
  38. iTotalRec := 0;   //先把总接收到的字节数置零
  39. fn := ClientSocket.Receiveln; //接收文件名
  40. iFileSize := StrToInt(ClientSocket.Receiveln); //接收文件大小,接收到的字符串,要转成integer
  41. f := TFileStream.Create('d:/rec/'+ fn,fmCreate);//创建文件
  42. try
  43. {如果接收到的总字节数小于文件总字节数且实际接收字节数不为-1就一直循环接收}
  44. while iTotalRec < iFileSize  do
  45. begin
  46. iacRec := ClientSocket.ReceiveBuf(pbuf^,512);//一次接收512字节
  47. if iacRec = -1 then
  48. Break;//如果实际接收字节数是-1表示出错了,退出循环(应该写个log,或作出错处理什么的)
  49. f.Write(pbuf^,iacRec);//把接收到的数据写到文件流中
  50. Inc(iTotalRec,iacRec);//叠加接收到的总字节数
  51. end;
  52. finally
  53. f.Free; //释放流
  54. end;
  55. finally
  56. FreeMem(pbuf);//释放内存
  57. end;
  58. end;
  59. end.
http://blog.csdn.net/zang141588761/article/details/52288692

用TTcpClient和TTcpServer进行文件的传输的更多相关文章

  1. windows与linux之间文件的传输方式总结(转)

    当然,windows与linux之间文件的传输的两种方式有很多,这里就仅仅列出工作中遇到的,作为笔记: 方法一:安装SSH Secure Shell Client客户端 安装即可登录直接拖拉到linu ...

  2. Linux SSH远程文件/目录传输命令scp

    转载地址:http://www.vpser.net/manage/scp.html 相信各位VPSer在使用VPS时会经常在不同VPS间互相备份数据或者转移数据,大部分情况下VPS上都已经安装了Ngi ...

  3. C# TCP实现多个客户端与服务端 数据 与 文件的传输

    C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜--- 下面是我用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端 ...

  4. Linux scp 远程文件/目录传输

    Linux scp远程文件/目录传输 1.获取远程服务器上的文件 scp -P 22 root@www.test.com:/root/test.tar.gz /home/test.tar.gz 上端口 ...

  5. DOS命令行使用pscp实现远程文件和文件夹传输(转)

    转自 http://snailwarrior.blog.51cto.com/680306/141201   pscp是putty安装包所带的远程文件传输工具,使用和Linux下scp命令相似,具体的使 ...

  6. 简单实现TCP下的大文件高效传输

    简单实现TCP下的大文件高效传输 在TCP下进行大文件传输不象小文件那样直接打包个BUFFER发送出去,因为文件比较大所以不可能把文件读到一个BUFFER发送出去.主要有些文件的大小可能是1G,2G或 ...

  7. windows与linux之间文件的传输

    这边记录一下如何在windows与linux之间进行文件的传输,下面是具体的网址. 原文地址::http://blog.csdn.net/shufac/article/details/51966276 ...

  8. Windows与Linux之间海量文件的传输与Linux下大小写敏感问题

    Windows与Linux之间海量文件的传输与Linux下大小写敏感问题 mount.cifs 支持通过网络文件系统挂载,不过需要安装cifs-utils,也可通过mount -t cifs挂载,详细 ...

  9. 使用linux的nc来进行文件的传输

    NAME nc - arbitrary TCP and UDP connections and listensSYNOPSIS     nc [-46DdhklnrStUuvz] [-i interv ...

随机推荐

  1. Java中利用Math.random()产生服从泊松分布的随机数

    众所周知.Java的Math.random()产生的是服从均匀分布的随机数,可是其它分布的应用也相当广泛,比如泊松分布和高斯分布(正态分布).而这些分布Java没有非常好的提供(高斯分布能够利用Ran ...

  2. 解决eclipse 保存卡顿的问题

    开发十年,就只剩下这套Java开发体系了 >>>   eclipse 如果启动慢,还可以接收. 可是如果是 保存的时候卡顿, 有时候会 卡顿 3秒-5 秒的,感觉到写代码特别的不顺畅 ...

  3. 10 个免费的 C/C++ 集成开发环境

    集成开发环境(IDE)可以给程序员提供很大的帮助.大多数的IDE包含编译器和解释器.例如微软的 Visual Studio 本身内置的编译器和解释就是很好的例子,Eclipse 是另一个很好的例子.鼓 ...

  4. Android Studio 2.3.1导出jar文件不能生成release解决办法

    升级了AS之后,在项目中的时候,有个需求需要把通过AS导出一个模块,需要以jar的形式导出来,研究了一下,按照网上的描述操作了一遍,不知道是AS版本问题还是自己操作问题,发现使用 ./gradlew ...

  5. WPF多线程UI更新

    前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对象.)这是很常见的一个错误,一不小 ...

  6. STL序列式容器之list

    一,list容器基本概念 1.list容器基本知识 list容器的底部数据结构为双向链表,可以高效的进行插入和删除元素. list因为底层数据结构是双向链表,因此不支持下标操作和.at()函数的操作. ...

  7. Leetcode 94 Binary Tree Inorder Traversal 二叉树

    二叉树的中序遍历,即左子树,根, 右子树 /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *lef ...

  8. 机器学习:深入理解LSTM网络 (二)

    之前我们介绍了RNN 网络结构以及其所遇到的问题,RNN 结构对于关联度太长的时序问题可能无法处理, 简单来说,RNN对于太久远的信息不能有效地储存,为了解决这个问题,有人提出了LSTM的网络结构,L ...

  9. Fedora15下搭建QT开发环境及编译QT(提前一键安装完,qt编译所有必需库 yum install gcc-c++ libXtst-devel freetype freetype-devel fontconfig-devel libXrender-devel )

    看了不少linux上编译qt的文章,实际上直接通过yum 安装qt是最方便的,请参考<yum安装qt> 不过初步接触fedora,为了了解一下如何在linux上编译.安装开源代码,所以必须 ...

  10. linux C Obstack

    Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obst ...