网站模板库
  • 首页
  • web前端工具
    • HTML/JS转换工具
    • JS/HTML格式化工具
    • 字母/英文大小写转换工具
    • robots.txt文件生成工具
    • Js压缩/格式化工具
    • Css在线压缩工具_代码格式化
  • 关于我们
    • 免责声明
    • 联系我们
    • 广告服务
    • 服务项目
    • 关于我们
    • 网站轮播
    • 公告
    • 成都优优科技专用
    • 按行业分类
  • web学院
    • 服务器教程
    • 学习资料
      • 基础书籍
      • 交互书籍
      • 入门教程
      • 特效分类
    • 案例分享
    • web资讯
  • 网页特效
    • 图片特效
    • 导航特效
    • 滑动按钮
    • 表单特效
    • 文字特效
    • 弹窗特效
    • 其他特效
  • 织梦模板
    • 科技/电子/数码/通信
    • 文化/艺术/广告/传媒
    • 装修/设计/家居/家具
    • 基建/施工/地产/物业
    • 餐饮/酒店/旅游/票务
    • 食品/果蔬/饮料/日用
    • 服饰/珠宝/礼品/玩具
    • 摄影/婚庆/家政/生活
    • 运动/健身/体育/器材
    • 学校/教育/培训/科研
    • 美容/保健/医院/医疗
    • 金融/财税/咨询/法律
    • 政府/组织/集团/协会
    • 汽车/物流/交通/搬运
    • 机械/设备/制造/仪器
    • 化工/环保/能源/材料
    • 农业/畜牧/养殖/宠物
    • 其他模版
    • IT/软件/信息/互联网
  • 手机模板
    • 手机APP模板
    • 微信小程序模板
    • wap
  • 网站模板
    • joomla模板
    • Drupal模板
    • z-blog模板
    • EyouCms模板
    • Bootstrap模板
    • 帝国cms模板
    • CmsEasy模板
    • MetInfo模板
    • 购物商城模板
      • Shopify主题
      • PrestaShop主题
    • 后台模板
    • 纯HTML模板
    • ecshop模板
    • phpwind模板
    • pbootcms模板
    • phpcms模板
    • wordpress模板
    • discuz模板
  • 教程
    • 织梦教程
    • Discuz教程
    • WordPress教程
    • Phpcms教程
    • Phpwind教程
    • ECShop教程
    • Joomla教程
    • Drupal教程
    • zblog教程
    • EyouCMS教程
    • 帝国cms教程
    • MetInfo教程
    • CmsEasy教程
登录
当前位置:网站模板库 > web学院 > 服务器教程 > Delphi IDTcpServer 如何实现向指定的Client 发送数据
商业源码 服务器教程 2024-02-12 8:24:01

Delphi IDTcpServer 如何实现向指定的Client 发送数据

Delphi IDTcpServer 如何实现向指定的Client 发送数据,第1张

Delphi 实现传送文件 ,你修改下就可以了
1建立两个工程Server及Client

分别放TServerSocket及TClientSocket控件,Demo,Edit控件等。

2设置TServerSocket name为 SS, ServerType为stNonBlocking,TClientSocket name为cs,ClientType为ctNonBlocking表示异步读写信息。注意ClientType和ServerType要相一致若为ctBlocking则表示同步读写信息。

3Socket传送文件的顺序图

a)Client-->Server MP_QUERY

b)Server-->Client MP_ACCEPT

c) Client-->Server MP_FileProperty

d)Server-->Client MP_NextWillBeData

e)Client-->Server MP_NextWillBeData

f)Server-->Client MP_DATA

g) Client-->Server 发送数据

h) Server接收数据并处理

i)Client-->Server MP_END结束

4Client端代码-----------------------------------------------------------------------------------------------------------------

unit UnitClient;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, Buttons, ExtCtrls, ComCtrls;
Const
//设置协议标志符
//标志将要发送文件名
MP_QUERY ='aaaaa';
//标志服务器拒绝接收
MP_REFUSE ='bbbbb';
//标志服务器同意接收文件
MP_ACCEPT ='ccccc';
//标志将要传递数据
MP_NEXTWILLBEDATA='ddddd';
//标志服务器端准备接收数据
MP_DATA ='eeeee';
//标志客户端取消了本次发送操作
MP_ABORT ='fffff';
//标志已经发送完毕
MP_END='iiiii';
//标志发送的文件长度
MP_FILEPROPERTY='jjjjj';
//指定每次发送包的大小
iBYTEPERSEND=1024;

type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
cs: TClientSocket;
Panel1: TPanel;
btnSendFile: TBitBtn;
edtIPAddress: TEdit;
Memo1: TMemo;
edtHostName: TEdit;
RB1: TRadioButton;
RB2: TRadioButton;
ProBar: TProgressBar;
Btncancel: TBitBtn;
Btnexit: TBitBtn;
procedure btnSendFileClick(Sender: TObject);
procedure csRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure BtncancelClick(Sender: TObject);
procedure BtnexitClick(Sender: TObject);
private
//定义一个发送文件的数据流
fsSend: TFileStream;
//设置开始状态位
tStart:Boolean;
//标识当前时间
TickCount:Longword;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R DFM}

//发送文件
procedure TForm1btnSendFileClick(Sender: TObject);
begin
//关闭套接字连接
csClose;
//初始化进程条
ProbarPosition:=0;
if RB1Checked then
begin
csHost:='';
//指定要连接的主机IP地址
csAddress:=edtIPAddressText;
end
else
//指定要连接的主机名
csHost:=edtHostNameText;
//要连接的主机所用端口号
csPort:=2000;
//打开套接字连接
csOpen;
//点击发送确认按钮
if OpenDialog1Execute then
Begin
//发送连接请求
csSocketSendText(MP_QUERY+OpenDialog1FileName);
end;
end;

//客户端接收来自服务器端的信息
procedure TForm1csRead(Sender: TObject; Socket: TCustomWinSocket);
var
MsgRecv:string;
bufSend:pointer;
iLength:Integer;
begin
//得到客户端发来的信息
MsgRecv:=SocketReceiveText;
//取前5位,得到协议标志符
MsgRecv:=copy(MsgRecv,1,5);
//接收到拒绝信息
if MsgRecv=MP_REFUSE then
memo1LinesAdd('连接请求被拒绝!')
//接收到确认接收信息
else if MsgRecv=MP_ACCEPT then
begin
//为要发送的文件创建文件流
fsSend:=TFileStreamCreate(OpenDialog1FileName,fmOpenRead);
tStart:=False;
//进度条显示
ProbarMax:=fsSendSize;
memo1LinesAdd('开始发送!');
//获取发送开始时的时间
TickCount:=GetTickCount;
//创建文件流并发送文件长度。
SocketSendText(MP_FILEPROPERTY+inttostr(Trunc(fsSendSize/iBYTEPERSEND)+1));
end
else if MsgRecv=MP_NEXTWILLBEDATA then
begin
//通知接收端将要传送数据。
SocketSendText(MP_NEXTWILLBEDATA);
end
else if MsgRecv=MP_DATA then
begin
//接收到确认信息,开始发送数据。
if not tStart then
begin
memo1LinesAdd('发送数据中 ');
tStart:=True;
end;
//还有数据没有发送。
if fsSendPosition< fsSendSize-1 then
begin
iLength:=fsSendSize-1-fsSendPosition;
//将数据分段发送
if iLength>iBYTEPERSEND then
iLength:=iBYTEPERSEND;
GetMem(bufSend,iLength+1);
try
//读取文件流数据
fsSendRead(bufSend^,iLength);
//发送长度为iLength的数据
SocketSendBuf(bufSend^,iLength);
//进度条显示
ProbarPosition:=fsSendPosition;
finally
//释放内存
FreeMem(bufSend,iLength+1);
end;
//发送完毕
end else
begin
//通知主机文件传送结束。
SocketSendText(MP_END);
memo1LinesAdd('发送完成!');
//获取发送耗时
memo1LinesAdd('发送耗时'+IntToStr(GetTickCount-TickCount)+'毫秒');
fsSendFree;
end;
//取消文件发送过程
end else if MsgRecv=MP_ABORT then
begin
memo1LinesAdd('中止!');
//文件传送取消
fsSendFree;
end;
end;
procedure TForm1FormCreate(Sender: TObject);
begin
Memo1Clear;
end;
//取消
procedure TForm1BtncancelClick(Sender: TObject);
begin
//取消文件发送过程
csSocketSendText(MP_ABORT);
end;

procedure TForm1BtnexitClick(Sender: TObject);
begin
Form1Close;
end;

end
5Server端代码------------------------------------------------------------------------------------------------

unit UnitServer;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ScktComp, ExtCtrls;
Const
//设置协议标志符
//标志将要发送文件名
MP_QUERY ='aaaaa';
//标志服务器拒绝接收
MP_REFUSE ='bbbbb';
//标志服务器同意接收文件
MP_ACCEPT ='ccccc';
//标志将要传递数据
MP_NEXTWILLBEDATA='ddddd';
//标志服务器端准备接收数据
MP_DATA ='eeeee';
//标志客户端取消了本次发送操作
MP_ABORT ='fffff';
//标志已经发送完毕
MP_END='iiiii';
//标志发送的文件长度
MP_FILEPROPERTY='jjjjj';
//指定每次发送包的大小
iBYTEPERSEND=1024;
type
TForm1 = class(TForm)
SaveDialog1: TSaveDialog;
ss: TServerSocket;
Memo1: TMemo;
procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
//定义一个接收文件的数据流
fsRecv:TFileStream;
//设置开始状态位
tStart:Boolean;
//标识当前时间
TickCount:Longword;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R DFM}
//服务器端接收来自客户端的信息
procedure TForm1ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
msgr,theFileName:string;
bufRecv:Pointer;
iLength:Integer;
begin
//接收到的数据的长度
iLength:=SocketReceiveLength;
//开辟一块新的内存,用来保存接收到的数据
GetMem(bufRecv,iLength);
try
//接收数据
SocketReceiveBuf(bufRecv^,iLength);
//将接收到的数据以字符串的形式存到msgr中
msgr:=StrPas(PChar(bufRecv));
//取前5个字符
msgr:=Copy(msgr,1,5);
if msgr=MP_QUERY then
begin
//去掉字符串前后的空格和控制字符
msgr:=Trim(StrPas(PChar(bufRecv)));
//第5个字符后面的字符串为文件名
theFileName:=ExtractFileName(Copy(msgr,6,Length(msgr)));
SaveDialog1Title:='请选择或输入接收到的数据保存到的文件名:';
SaveDialog1FileName:=theFileName;
//点击确认保存按钮
if SaveDialog1Execute then
begin
//为需保存的文件创建文件流
fsRecv:=TFileStreamCreate(SaveDialog1FileName,fmCreate);
//如果同意接收数据。
memo1LinesAdd ('开始接收!');
TickCount:=GetTickCount;
//发送同意接收文件的信息
SocketSendText(MP_ACCEPT);
tStart:=False;
end
else
//发送拒绝接收文件的信息
SocketSendText(MP_REFUSE);
end
else if msgr=MP_FILEPROPERTY then
begin
//接收文件长度并说明主机可以接收数据了
SocketSendText(MP_NEXTWILLBEDATA);
end
else if msgr=MP_NEXTWILLBEDATA then
begin
//要求发送端发送数据
SocketSendText(MP_DATA);
end else if msgr=MP_END then
begin
memo1LinesAdd ('文件传送完成!');
memo1LinesAdd ('接收耗时'+IntToStr(GetTickCount-TickCount)+'毫秒');
fsRecvFree;
end
//接收到文件传送取消信息
else if msgr=MP_ABORT then
begin
memo1LinesAdd ('MP_ABORT');
SocketSendText(MP_ABORT);
fsRecvFree;
end
else
begin
if not tStart then
begin
memo1LinesAdd('接收数据');
tStart:=True;
end;
//将接收缓冲区数据写入文件
fsRecvWriteBuffer(bufRecv^,iLength);
//通知客户端继续发送数据
SocketSendText(MP_DATA);
end;
finally
//释放内存
FreeMem(bufRecv,iLength);
end;
end;

procedure TForm1FormCreate(Sender: TObject);
begin
Memo1Clear;
//设置的监听端口
ssPort:=2000;
//开始监听
ssOpen;
end;

procedure TForm1FormDestroy(Sender: TObject);
begin
ssClose;
end;

end

数据 文件 标志 信息 客户端
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Delphi IDTcpServer 如何实现向指定的Client 发送数据

商业源码 钻石

分享到:
上一篇
如何设置HTTP代理
下一篇
服务器硬盘检测失败的解决方法

相关推荐

怎样模拟Unity游戏环境并从服务器直接下载asset到本地?

怎样模拟Unity游戏环境并从服务器直接下载asset到本地?

什么是dhcp服务器

什么是dhcp服务器

购买服务器,购买前大概说收费,付款后开始各种乱收费

购买服务器,购买前大概说收费,付款后开始各种乱收费

ftp软件服务器端和客户端有哪些

ftp软件服务器端和客户端有哪些

0条评论

发表评论 取消回复

要发表评论,您必须先登录。

提供最优质的资源集合

立即查看 了解详情
网站模板库

主题/付费下载/查看/余额管理/自定义积分,集成支付,卡密,推广奖励等。

本站导航
  • 链接标题
友情链接
  • 链接标题
快速搜索
本站由钛宇宙强力驱动
友情链接:
    商业源码网蜀ICP备2023005044号
    网站模板库
    • 登录
    • 注册
    网站模板库
    • 首页
    • web前端工具►
      • HTML/JS转换工具
      • JS/HTML格式化工具
      • 字母/英文大小写转换工具
      • robots.txt文件生成工具
      • Js压缩/格式化工具
      • Css在线压缩工具_代码格式化
    • 关于我们►
      • 免责声明
      • 联系我们
      • 广告服务
      • 服务项目
      • 关于我们
      • 网站轮播
      • 公告
      • 成都优优科技专用
      • 按行业分类
    • web学院►
      • 服务器教程
      • 学习资料►
        • 基础书籍
        • 交互书籍
        • 入门教程
        • 特效分类
      • 案例分享
      • web资讯
    • 网页特效►
      • 图片特效
      • 导航特效
      • 滑动按钮
      • 表单特效
      • 文字特效
      • 弹窗特效
      • 其他特效
    • 织梦模板►
      • 科技/电子/数码/通信
      • 文化/艺术/广告/传媒
      • 装修/设计/家居/家具
      • 基建/施工/地产/物业
      • 餐饮/酒店/旅游/票务
      • 食品/果蔬/饮料/日用
      • 服饰/珠宝/礼品/玩具
      • 摄影/婚庆/家政/生活
      • 运动/健身/体育/器材
      • 学校/教育/培训/科研
      • 美容/保健/医院/医疗
      • 金融/财税/咨询/法律
      • 政府/组织/集团/协会
      • 汽车/物流/交通/搬运
      • 机械/设备/制造/仪器
      • 化工/环保/能源/材料
      • 农业/畜牧/养殖/宠物
      • 其他模版
      • IT/软件/信息/互联网
    • 手机模板►
      • 手机APP模板
      • 微信小程序模板
      • wap
    • 网站模板►
      • joomla模板
      • Drupal模板
      • z-blog模板
      • EyouCms模板
      • Bootstrap模板
      • 帝国cms模板
      • CmsEasy模板
      • MetInfo模板
      • 购物商城模板►
        • Shopify主题
        • PrestaShop主题
      • 后台模板
      • 纯HTML模板
      • ecshop模板
      • phpwind模板
      • pbootcms模板
      • phpcms模板
      • wordpress模板
      • discuz模板
    • 教程►
      • 织梦教程
      • Discuz教程
      • WordPress教程
      • Phpcms教程
      • Phpwind教程
      • ECShop教程
      • Joomla教程
      • Drupal教程
      • zblog教程
      • EyouCMS教程
      • 帝国cms教程
      • MetInfo教程
      • CmsEasy教程

      弹窗标题

      这是一条网站公告,可在后台开启或关闭,可自定义背景颜色,标题,内容,用户首次打开关闭后不再重复弹出,此处可使用html标签...