服务端

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 文件传输的更多相关文章

  1. 基于序列化技术(Protobuf)的socket文件传输

    好像好久都没更博文了,没办法,最近各种倒霉事情,搞到最近真的没什么心情,希望之后能够转运吧. 言归正传,这次我要做的是基于序列化技术的socket文件传输来无聊练一下手. 一.socket文件传输 之 ...

  2. Java基于Socket文件传输示例(转)

    最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加 ...

  3. Java基于Socket文件传输示例

    http://www.blogjava.net/sterning/archive/2007/10/13/152508.html 最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步 ...

  4. Linux网络编程:socket文件传输范例

    基于TCP流协议的socket网络文件传输Demo: 实现:C语言功能:文件传输(可以传任何格式的文件) /********************************************** ...

  5. python socket文件传输实现

    简单版 server(服务端) import socket import subprocess import struct import json import os share_dir = r'E: ...

  6. Android连接热点的Socket文件传输

    最近把测试丢过来的种种BUG解决后,终于有时间去研究研究Socket通信,再加上以前做的WiFi连接和热点开启,于是有了现在的这篇博文:创建热点发送文件,让另一台手机连接热点接收文件. 效果图: 两台 ...

  7. python 3.7 利用socket文件传输

    参考:https://www.cnblogs.com/VseYoung/p/socket_1.html 参考 https://blog.csdn.net/a19990412/article/detai ...

  8. [Socket]Socket文件传输

    1.Server import java.io.DataInputStream; import java.io.FileOutputStream; import java.io.IOException ...

  9. python 3.x 学习笔记14 (socket_ssh and socket_文件传输)

    ssh服务端 import socket,os server = socket.socket() server.bind(('localhost',6666)) server.listen() con ...

随机推荐

  1. TCP三次握手与四次分手

    TCP简介 首先来看看OSI的七层模型: 我们需要知道TCP工作在网络OSI的七层模型中的第四层--Transport层,IP在第三层--Network层,ARP在第二层--Data Link层:在第 ...

  2. R语言与分类算法的绩效评估(转)

    关于分类算法我们之前也讨论过了KNN.决策树.naivebayes.SVM.ANN.logistic回归.关于这么多的分类算法,我们自然需要考虑谁的表现更加的优秀. 既然要对分类算法进行评价,那么我们 ...

  3. 360你吃屎啊你,hao123,12345等等

    请看到这个文章的小伙伴将文章看完,看看我的感受是有多深,谢谢了 现在浏览器已经是人们经常用的东西,相信都有时不时就差度娘的习惯吧 也就是说每个人都有自己喜欢的主页 可电脑有时候就是遭不住,360什么的 ...

  4. 《HelloGitHub》第 14 期

    公告 欢迎通过在 GitHub 上新建 issues 方式推荐项目,我真心希望读者可以在 HelloGItHub,找到真正的编程乐趣! <HelloGitHub>第 14 期 兴趣是最好的 ...

  5. java将类和函数封装成jar,然后在别的项目中使用这个jar包

    本来想用idea安装的,不过用maven生成后发现jar有20,30M肯定不对,后来还是用eclipse生成了,方便很多 环境: eclipse luna,jdk1.8_112 1.生成jar包,首先 ...

  6. Seafile安装踩坑

    欢迎大家访问我的博客新地址: 博客:http://monsterlin.com/ 原文地址:http://monsterlin.com/archives/HowToInstallSeafile.htm ...

  7. 如何实现windows命令提示符的tab补全

    1:使用win+r打开 运行 控制台 2:输入 regedit 打开注册表 3:进入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\Co ...

  8. JavaScript中Object的总结

    基于原型继承,动态对象扩展,闭包,JavaScript已经成为当今世界上最灵活和富有表现力的编程语言之一. 这里有一个很重要的概念需要特别指出:在JavaScript中,包括所有的函数,数组,键值对和 ...

  9. Thrift总结(一)介绍

    这段时间,一直在整理公司的内部 rpc 服务接口,面临的一个问题就是:由于公司内部的系统由几个不同的语言编写的.C# ,java,node.js 等,如何实现这些内部系统之间的接口统一调用,确实是比较 ...

  10. 【基础】C#异常处理的总结

    一.异常处理的理解? 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常. 因此处理这种错误,就称为异常处理. 二.异常处理如何操作? C# 异常处理时建立在四个关键词之上的: ...