在Windows操作系统的平台上,WinSock是首选的网络编程接口,用于在网络上传输数据和交换信息,它构成了Windows操作系统进行网络编程的基础。对于编写网络应用程序来说,WinSock是一门非常重要的并且必须掌握的知识,虽然现在有很多的工具如FTP程序可以在网络上传输数据和文件,但是通过WinSock编程具有更大的灵活性,因为它不需要关心网络连接的细节问题。然而用WinSock编程却相当复杂,但是在Delphi中我们并不需要直接与WinSock的API函数打交道,因在Delphi中的TClientSocket组件和TServerSocket组件封装了WinSock的大部分API函数,使得对WinSock的编程大大简化。在网络通信协议的面向连接服务中,进行传输数据和交换信息之前,通信双方应该建立一条用于进行数据交换的“链路”,通信双方就是利用这个“链路”进行稳定可靠的数据传输,由于建立通信的双方都处于收发信息的状态,并且保证了数据传输的稳定性,所以在传输较大的文件时,具有较高的效率。而建立“链路”和断掉“链路”都需要消耗一定的时间,所以在传输较小文件时的效率是比较低的。

  在这里我们将了解winsock如何实现远程传输数据和文件。在一个局域网内不同的计算机上分别运行服务器端程序和客户端程序。服务器端运行后就启动,socket将建立侦听状态。客户端运行后,在客户端程序中填写服务器IP地址,然后单击“连接”按钮,向服务器端发出一个建立连接的请求,如图1所示。如果通客户端程序过端口成功和服务器端连接,服务器端的状态栏就会有“已和客户端连接”的提示,并准备传输文件,如图2所示。

  

  图1

  

  图2

  单击“发送”按钮,在弹出的对话框中选择一个准备发送的文件,然后客户端将文件的大小和其他信息等发送到服务器端,服务器端接受到文件的信息后通知客户端开始传送文件,文件的数据需要多次传递,服务器将文件全部接受并保存。系统运行如图3、图4所示:

  

  图3

  

  图4

  服务器端程序编写:

新建一个项目,并把一个TServerSocket组件放到Form1窗体上,Active设为True;端口Port设为2000,其它属性按默认值。服务器端程序代码如下:

  unit Unit1;

  interface

  uses

   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

   Dialogs, StdCtrls, ScktComp, ComCtrls, DB, DBTables, XPMan;

  Const

   MP_QUERY ='1';

   MP_REFUSE ='2';

   MP_ACCEPT ='3';

   MP_NEXTWILLBEDATA ='4';

   MP_DATA ='5';

   MP_ABORT ='6';

   MP_OVER ='7';

   MP_CHAT ='8';

   MP_END ='9';

   MP_FILEPROPERTY ='0';

   iBYTEPERSEND=1024;

  type

   TForm1 = class(TForm)

  Serversocket: TServerSocket;

   Query1: TQuery;

   GroupBox1: TGroupBox;

   Memo1: TMemo;

   XPManifest1: TXPManifest;

   StatusBar1: TStatusBar;

   Button1: TButton;

   procedure serversocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);

   procedure serversocketClientRead(Sender: TObject; Socket: TCustomWinSocket);

   procedure serversocketClientError(Sender: TObject; Socket: TCustomWinSocket;

   ErrorEvent: TErrorEvent; var ErrorCode: Integer);

   procedure Button1Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

  

   private

   fsRecv:TMemoryStream;

   public

   { Public declarations }

   end;

  

  var

   Form1: TForm1;

   bReadText:boolean;

  

  implementation

  

  {$R *.dfm}

  

  procedure TForm1.FormCreate(Sender: TObject);

  begin

   Serversocket.Port:=2000;//设置侦听端口为2000;

   bReadText:= true;

   Serversocket.Open;

   StatusBar1.SimpleText:=' 就绪 ';

  end;

  

  procedure TForm1.ServersocketClientConnect(Sender: TObject;

   Socket: TCustomWinSocket);

  begin

   Statusbar1.SimpleText:=' 已和IP地址为 '+Socket.RemoteAddress+' 客户端连接 ';

  end;

  

  procedure TForm1.serversocketClientRead(Sender: TObject; Socket: TCustomWinSocket);

  var

   sTemp ,existfile, newfile : string;

   bufRecv:Pointer;

   iNum:integer;

   begin

   Memo1.Lines.Add('received size :' + intToStr(Socket.ReceiveLength));

   if bReadText then

   begin

   sTemp:=Socket.ReceiveText;

   case sTemp[1] of

   MP_QUERY:

   begin

   Memo1.Lines.Add('receive MP_QUERY');

   existfile:=Copy(sTemp,2,Length(STemp)); ;

   newfile:= 'c:\Administrator\'+ExtractFileName(existfile);

   copyfile(pchar(existfile),pchar(newfile),false);

   serversocket.Socket.Connections[0].SendText(MP_ACCEPT);

  

   fsRecv := TMemoryStream.Create;

  

   serversocket.Socket.Connections[0].SendText(MP_REFUSE+'');

   end;

   MP_FILEPROPERTY:

   begin

   Memo1.Lines.Add('receive MP_FILEPROPERTY');

   serversocket.Socket.Connections[0].SendText(MP_NEXTWILLBEDATA);

   end;

   MP_NEXTWILLBEDATA:

   begin

   Memo1.Lines.Add('receive MP_NEXTWILLBEDATA');

   bReadText:=false;

   serversocket.Socket.Connections[0].SendText(MP_DATA);

   end;

   MP_END:

   begin

   Memo1.Lines.Add('receive MP_END');

   fsRecv.Free;

   bReadText:=true;

   end;

   MP_ABORT:

   begin

   Memo1.Lines.Add('receive MP_ABORT');

   fsRecv.Free;

   bReadText:=true;

   end;

   MP_CHAT:

   begin

   Memo1.Lines.Add('receive MP_CHAT');

   end;

   end;{of case}

   end

   else

   begin

   try

  

   GetMem(bufRecv, iBYTEPERSEND);

   iNum := Socket.ReceiveBuf(bufRecv^, iBYTEPERSEND);

   fsRecv.WriteBuffer(bufRecv^, iNum);

   finally

   FreeMem(bufRecv);

   end;{of try}

   bReadText:=true;

  

   if iNum = iBYTEPERSEND THEN

   begin

   serversocket.Socket.Connections[0].SendText(MP_NEXTWILLBEDATA);

   end

   else

   begin

  

   fsRecv.Free;

   serversocket.Socket.Connections[0].SendText(MP_END);

   end;

   end;

   end;

  procedure TForm1.serversocketClientError(Sender: TObject; Socket: TCustomWinSocket;

   ErrorEvent: TErrorEvent; var ErrorCode: Integer);

  begin

   Memo1.Lines.Add('ErrorCode :' + IntToStr(ErrorCode));

   ErrorCode := 0;

  end;

  

  procedure TForm1.Button1Click(Sender: TObject);

  var

   i, j: integer;

  begin

   J := serversocket.Socket.ActiveConnections;

   Memo1.Lines.Add('ActiveConnectiong is ' + inttostr(j));

  end;

  end.

  客户端程序编写:

  新建一个工程,并把一个TClientSocket组件放到Form1窗体上,Port设为2000(端口号可任意设置,要求客户端和服务器端统一),其它属性按默认值。具体客户端程序代码如下:

  unit Unit2;

  interface

  uses

   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

   Dialogs, StdCtrls, ScktComp, ComCtrls, XPMan;

  const

   MP_QUERY ='1';

   MP_REFUSE ='2';

   MP_ACCEPT ='3';

   MP_NEXTWILLBEDATA='4';

   MP_DATA ='5';

   MP_ABORT ='6';

   MP_OVER ='7';

   MP_CHAT ='8';

   MP_END ='9';

   MP_FILEPROPERTY ='0';

   iBYTEPERSEND=1024;

  

  type

   TForm1 = class(TForm)

   cs: TClientSocket;

   OpenDialog1: TOpenDialog;

   StatusBar1: TStatusBar;

   GroupBox1: TGroupBox;

   edtIPAddress: TEdit;

   Edit2: TEdit;

   btnSendFile: TButton;

   btnConnect: TButton;

   XPManifest1: TXPManifest;

   GroupBox2: TGroupBox;

   Label1: TLabel;

   edtSize: TEdit;

   Memo1: TMemo;

   procedure btnConnectClick(Sender: TObject);

   procedure btnSendFileClick(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure csRead(Sender: TObject; Socket: TCustomWinSocket);

   private

   fsSend:TFileStream;

   public

   { Public declarations }

   end;

  

  var

   Form1: TForm1;

  

  implementation

  

  {$R *.dfm}

  procedure TForm1.btnConnectClick(Sender: TObject);

   begin

   cs.Address := edtIPAddress.Text;

   cs.Port:=2000;

   cs.Open;

   end;

  

  procedure TForm1.btnSendFileClick(Sender: TObject);

  begin

  if OpenDialog1.Execute then

   Begin

   cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);

   end;

  end;

  

  procedure TForm1.FormCreate(Sender: TObject);

  begin

   edtipaddress.Text:='127.0.0.1';

  end;

  

  procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);

  var

   sRecv:string;

   iNum:integer;

   bufSend:pointer;

   begin

   sRecv:=Socket.ReceiveText;

   Memo1.Lines.Add('sRecv =' + sRecv);

   Case sRecv[1] of

   MP_REFUSE:ShowMessage('Faint,be refused!');

   MP_ACCEPT:begin

   Memo1.Lines.Add('MP_ACCEPT');

   fsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);

   edtSize.Text:=IntToStr(fsSend.Size);

   edit2.text:='total count:'+IntToStr(Trunc(fsSend.Size/iBYTEPERSEND)+1);

   cs.Socket.SendText(MP_FILEPROPERTY+IntToStr(Trunc(fsSend.Size/iBYTEPERSEND)+1));

   fsSend.Seek(0, soFromBeginning);

   end;

   MP_NEXTWILLBEDATA:begin

   Memo1.Lines.Add('MP_NEXTWILLBEDATA');

   Socket.SendText(MP_NEXTWILLBEDATA);

   end;

   MP_DATA:

   begin

   Memo1.Lines.Add('MP_DATA');

   try

   GetMem(bufSend, iBYTEPERSEND);

   iNum := fsSend.Read(bufSend^, iBYTEPERSEND);

   cs.Socket.SendBuf(bufSend^, iNum);

   Memo1.Lines.Add('Send Buf finished');

   finally

   FreeMem(bufSend);

   end;{of try}

   end;

   MP_END:

   begin

   Memo1.Lines.Add('MP_END');

   fsSend.Free;

   end;

   MP_ABORT:begin

   Memo1.Lines.Add('MP_ABORT');

   fsSend.Free;

   end;

   end;

   end;

  end.

转载于:https://www.cnblogs.com/MaxWoods/p/3822416.html

Delphi实例分析:远程传输数据和文件相关推荐

  1. lgo怎么打开o文件_GO语言文件的创建与打开实例分析

    本文实例分析了GO语言文件的创建与打开用法.分享给大家供大家参考.具体分析如下: 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的.Golang 对文件的支持是在 os pack ...

  2. php5.4 curl,PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析

    本文实例分析了PHP5.0~5.6 各版本兼容性cURL文件上传功能.分享给大家供大家参考,具体如下: 最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件 ...

  3. php中file对象实例,AJAX_File, FileReader 和 Ajax 文件上传实例分析(php),File FileReader 可以干什么? Ajax - phpStudy...

    File, FileReader 和 Ajax 文件上传实例分析(php) File FileReader 可以干什么?Ajax文件上传例子 FileReader 对象可以读取文件的 Base64编码 ...

  4. python3.5怎么打开_Python3.5文件修改操作实例分析

    Python3.5文件修改操作实例分析 本文实例讲述了Python3.5文件修改操作.分享给大家供大家参考,具体如下: 1.文件修改的两种方式 (1)像vim一样将文件加载到内存中,修改完之后再写回源 ...

  5. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

  6. python爬虫电影输出到文件中_python爬虫用scrapy获取影片的实例分析

    我们平时生活的娱乐中,看电影是大部分小伙伴都喜欢的事情.周围的人总会有意无意的在谈论,有什么影片上映,好不好看之类的话题,没事的时候谈论电影是非常不错的话题.那么,一些好看的影片如果不去电影院的话,在 ...

  7. python执行bat文件_Python中调用PowerShell、远程执行bat文件实例

    python调用本地powershell方法 1.现在准备一个简陋的powershell脚本,功能是测试一个IP列表哪些可以ping通: function test_ping($iplist) { f ...

  8. gpgpu-sim卡分配程序设计实例分析

    gpgpu-sim卡分配程序设计实例分析 运行代码地址:https://github.com/gpgpu-sim/gpgpu-sim_distribution 一.概述 此文件包含有关安装.生成和运行 ...

  9. RPC-原理及RPC实例分析

    还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...

最新文章

  1. python 文字语音朗读-python 利用pyttsx3文字转语音
  2. CVPR2017: Learning Deep Context-aware Features over Body and Latent Parts for
  3. IT人员健康信号之肠胃保养
  4. Qt Creator构建并运行示例
  5. 【Python学习】 - Pandas学习 sort_value( ),sort_index( )排序函数的区别与使用
  6. 大数据Hadoop2.x与Hadoop3.x相比较有哪些变化
  7. 计算机类自主招生推荐信,自主招生推荐信范文:中国人民大学自主招生推荐信...
  8. 低版本wordpress运行在PHP5.4上如何关闭warning信息
  9. 掐头法和去尾法记音标
  10. 百度云2019落地第一枪打响:两款智能边缘硬件,让城市环卫、农药喷洒都AI起来...
  11. 五、Docker+Sqlserver
  12. Photoshop 22.5 新功能:更多天空替换素材下载、弯曲变形与探索功能的强化
  13. 高效记忆/形象记忆(13)110数字编码表 71-80
  14. java 多线程发送邮件_多线程实现发送邮件功能
  15. NewStarCTF 公开赛wp
  16. 删库跑路(错误0x80070091:目录不是空的)该如何解决???还是别解决了。。。
  17. 推荐几款电脑测试软件
  18. java里面case是什么意思_什么是Java中的switch case语句以及如何使用它?
  19. 使用华为云Linux宝塔面板搭建网站+遇到的报错解决
  20. Laya Air+Unity3D双引擎带你做个天空球3D小游戏(下篇)

热门文章

  1. 【原创】SSRS (SQL Serve Reporting Service) 访问权限的问题
  2. unity3d iPhone文件目录介绍
  3. Can't connect to MySQL server on 'localhost' (10061)的解决办法!
  4. 结构体指针和数组理解
  5. tcpdump抓包对性能的影响
  6. 背景建模之单高斯实现
  7. SqlServer高级特性--存储过程
  8. mysql对执行结果进行html格式的输出?输出html格式?
  9. SQLite编译(How To Compile SQLite)
  10. HTML事件的执行顺序