Socket 文件传输
服务端
1.控件:TServerSocket
2.OnClientRead事件处理
procedure TMainForm.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
msgr,theFileName:ansistring;
bufRecv:Pointer;
acc,iLength:Integer;
begin
acc:=0; //接收 0 1-不接受
//接收到的数据的长度
iLength:=Socket.ReceiveLength;
//开辟一块新的内存,用来保存接收到的数据
//GetMem(bufRecv,iLength+1);
bufRecv:=AllocMem(iLength+1); //// xe2 要AllocMem 且+1
{ //拷贝数据到缓存 d6
Buf:=AllocMem(BufSize);
StrCopy(Buf,pchar(st));
}
try
//接收数据
Socket.ReceiveBuf(bufRecv^,iLength);
//将接收到的数据以字符串的形式存到msgr中
msgr:=StrPas(PansiChar(bufRecv)); //
//取前5个字符
msgr:=Copy(msgr,1,5);
if msgr=MP_QUERY then
begin
//去掉字符串前后的空格和控制字符
msgr:= StrPas(PansiChar(bufRecv)); // PChar
//第5个字符后面的字符串为文件名
theFileName:=ExtractFileName(Copy(msgr,6,Length(msgr)-5));
StB.Panels[0].Text:='准备接收文件';
memo1.Lines.Add('接收文件:'+theFileName);
//SaveDialog1.Title:='请选择或输入接收到的数据保存到的文件名:';
//SaveDialog1.FileName:=ansistring(theFileName); //ansistring
//点击确认保存按钮
if acc=0 then //if SaveDialog1.Execute then
begin
//为需保存的文件创建文件流
try
fsRecv:=TFileStream.Create('V:\自助拷贝\内网到外网\'+theFileName,fmCreate); //fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
except
Socket.SendText(MP_ABORT);
exit;
end;
//如果同意接收数据。
StB.Panels[0].Text:='开始接收';
//memo1.Lines.Add ('开始接收!');
TickCount:=GetTickCount;
//发送同意接收文件的信息
Socket.SendText(MP_ACCEPT);
tStart:=False;
end
else
//发送拒绝接收文件的信息
Socket.SendText(MP_REFUSE);
end
else if msgr=MP_FILEPROPERTY then
begin
//接收文件长度并说明主机可以接收数据了
Socket.SendText(MP_NEXTWILLBEDATA);
end
else if msgr=MP_NEXTWILLBEDATA then
begin
//要求发送端发送数据
Socket.SendText(MP_DATA);
end else if msgr=MP_END then
begin
//memo1.Lines.Add ('文件:'+theFileName);
memo1.Lines.Add('成功');
StB.Panels[0].Text:= '传送完成';
//memo1.Lines.Add (timetostr(time())+'传送完成,接收耗时'+IntToStr(GetTickCount-TickCount)+'毫秒');
StB.Panels[1].Text:='接收耗时'+IntToStr(GetTickCount-TickCount)+'毫秒';
fsRecv.Free;
end
//接收到文件传送取消信息
else if msgr=MP_ABORT then
begin
//memo1.Lines.Add ('MP_ABORT');
StB.Panels[0].Text:= 'MP_ABORT';
Socket.SendText(MP_ABORT);
fsRecv.Free;
end
else
begin
if not tStart then
begin
//memo1.Lines.Add('接收文件...');
StB.Panels[0].Text:='接收文件...';
tStart:=True;
end;
//将接收缓冲区数据写入文件
fsRecv.WriteBuffer(bufRecv^,iLength);
//通知客户端继续发送数据
Socket.SendText(MP_DATA);
end;
finally
//释放内存
FreeMem(bufRecv,iLength);
end;
end;
客户端
1.控件TClienSockte
2.添加文件:
try
StB.Panels.Items[0].Text:=('读文件');
cs.Socket.SendText(MP_QUERY+ansistring(OpenDialog1.FileName)); //ansistring
btnSendFile.Enabled:=false;
Application.ProcessMessages;//增加简单多线程,防假死
except
showmessage('无法连接服务器');
btnSendFile.Enabled:=True;
end;
3. ClienSockte.open
4.TClienSockte onread 事件
//客户端接收来自服务器端的信息
procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);
var
MsgRecv: ansistring; // ansistring
bufSend:pointer;
iLength:Integer;
begin
//得到客户端发来的信息
MsgRecv:=socket.ReceiveText; //ansistring
//取前5位,得到协议标志符
MsgRecv:=copy(MsgRecv,1,5);
//接收到拒绝信息
if MsgRecv=MP_REFUSE then
StB.Panels.Items[0].Text:=('连接请求被拒绝!')
//接收到确认接收信息
else if MsgRecv=MP_ACCEPT then
begin
//为要发送的文件创建文件流
fsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
tStart:=False;
//进度条显示
Probar.Max:=fsSend.Size;
StB.Panels.Items[0].Text:=('开始发送!');
memo1.Lines.Add('发送文件:'+OpenDialog1.FileName);
//获取发送开始时的时间
TickCount:=GetTickCount;
//创建文件流并发送文件长度。
Socket.SendText(MP_FILEPROPERTY+ ansistring(inttostr(Trunc(fsSend.Size/iBYTEPERSEND)+1)));
end
else if MsgRecv=MP_NEXTWILLBEDATA then
begin
//通知接收端将要传送数据。
Socket.SendText(MP_NEXTWILLBEDATA);
end
else if MsgRecv=MP_DATA then
begin
//接收到确认信息,开始发送数据。
if not tStart then
begin
StB.Panels.Items[0].Text:=('发送中...');
StB.Panels.Items[1].Text:=('');
Btnexit.Enabled:=false;
tStart:=True;
end;
//还有数据没有发送。
if fsSend.Position< fsSend.Size-1 then
begin
iLength:=fsSend.Size-1-fsSend.Position+1;
//将数据分段发送
if iLength>iBYTEPERSEND then
iLength:=iBYTEPERSEND;
GetMem(bufSend,iLength);
try
//读取文件流数据
fsSend.Read(bufSend^,iLength);
//发送长度为iLength的数据
Socket.SendBuf(bufSend^,iLength);
//进度条显示
Probar.Position:=fsSend.Position;
finally
//释放内存
FreeMem(bufSend,iLength);
end;
//发送完毕
end else
begin
//通知主机文件传送结束。
Socket.SendText(MP_END);
//获取发送耗时
memo1.Lines.Add('完成!');
StB.Panels.Items[0].Text:='发送完毕';
StB.Panels.Items[1].Text:='耗时'+IntToStr(GetTickCount-TickCount)+'毫秒' ;
btnSendFile.Enabled:=True;
Btnexit.Enabled:=True;
fsSend.Free;
end;
//取消文件发送过程
end else if MsgRecv=MP_ABORT then
begin
btnSendFile.Enabled:=True;
StB.Panels.Items[0].Text:=('文件传输被中止');
exit;
//文件传送取消
fsSend.Free;
end;
end;
Socket 文件传输的更多相关文章
- 基于序列化技术(Protobuf)的socket文件传输
好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...
- Java基于Socket文件传输示例(转)
最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...
- Java基于Socket文件传输示例
http://www.blogjava.net/sterning/archive/2007/10/13/152508.html 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步 ...
- Linux网络编程:socket文件传输范例
基于TCP流协议的socket网络文件传输Demo: 实现:C语言功能:文件传输(可以传任何格式的文件) /********************************************** ...
- python socket文件传输实现
简单版 server(服务端) import socket import subprocess import struct import json import os share_dir = r'E: ...
- Android连接热点的Socket文件传输
最近把测试丢过来的种种BUG解决后,终于有时间去研究研究Socket通信,再加上以前做的WiFi连接和热点开启,于是有了现在的这篇博文:创建热点发送文件,让另一台手机连接热点接收文件. 效果图: 两台 ...
- python 3.7 利用socket文件传输
参考:https://www.cnblogs.com/VseYoung/p/socket_1.html 参考 https://blog.csdn.net/a19990412/article/detai ...
- [Socket]Socket文件传输
1.Server import java.io.DataInputStream; import java.io.FileOutputStream; import java.io.IOException ...
- python 3.x 学习笔记14 (socket_ssh and socket_文件传输)
ssh服务端 import socket,os server = socket.socket() server.bind(('localhost',6666)) server.listen() con ...
随机推荐
- 点评阿里JAVA手册之编程规约(OOP 规约 、集合处理 、并发处理 、其他)
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文难度系数为三星(★★★) 本文为第二篇 第一篇 点评阿里JAVA手 ...
- 传统平面广告已OUT出局,VR全景异军突起——VR全景智慧城市
VR,近两年异军突起的"黑科技".从1935年斯坦利·温鲍姆首次在小说中描述VR眼镜,到如今PC头盔.VR分体机以及VR一体机的相继问世,VR自身已从虚拟走向现实.而当硬件迭代逐步 ...
- 资深小白带你走进OS Memory
图片来源:http://www.tomshardware.com/ 序言: Memory(内存)是一台计算机组成的重要部分,也是最基础的一部分.其它基础组件有主板.CPU.磁盘.显卡(可独立可集成)等 ...
- 每天一个Linux命令—— crontab
一.简介 1. Linux中有许多周期性执行的任务,这些任务由cron守护进程完成,因此cron这个系统服务是默认启动的. 2.Linux中调度任务分为两类:系统任务调度和用户任务调度,系统任务调度即 ...
- 如何编写Spring-Boot自动配置
摘要 本文主要介绍如何把一个spring的项目(特别是一些公共工具类项目),基于spring boot的自动配置的思想封装起来,使其他Spring-Boot项目引入后能够进行快速配置. AutoCon ...
- gulp - less 在node.js上的安装和使用
推荐个一个网站 http://www.ydcss.com/ 很详细的入门gulp 官网 http://www.gulpjs.com.cn/docs/getting-started/ 下面 是我的个人总 ...
- Mybatis学习(一) - 快速入门
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装. MyBatis可以使用简单的XML或注解用 ...
- 利用Excel做一些简单的数据分析
先来几个原始数据的截图,如下所示: 示例图就举一个吧,因为这些数据量还挺大的,大概的总结了一下,这下列这几栏中不合规范的数据占比很大: (1)民族(经分析,在此表中所涉及到的民族分别为:汉族,满族,蒙 ...
- 初学unslider
1.关于unslider下载 官方提供的下载页面是http://www.bootcss.com/p/unslider/,但总是进不了下载页面,所以我就查看主页的源码,找到unslider.min.js ...
- 浏览器未安装flash插件,js判断直接去官网安装
近期做了个活动页,里面根据需求插入了阿里云的视频,常见的浏览器都支持包括低版本的. 由于浏览器的更新换代很多版本放弃了flash的插件安装,火狐就是其中之一. 未安装flash的浏览器如果打开这个链接 ...