服务端

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. 写给Android App开发人员看的Android底层知识(5)

    (十)Service Service有两套流程,一套是启动流程,另一套是绑定流程.我们做App开发的同学都应该知道. 1)在新进程启动Service 我们先看Service启动过程,假设要启动的Ser ...

  2. Git 使用记录

    在win7平台已经安装好了git的情况下: 1,Git 本地仓库建立与使用步骤: (2)新建立文件夹: $ mkdir learngit $ cd learngit $ pwd /Users/mich ...

  3. kafka 0.8.2 消息生产者 producer

    package com.hashleaf.kafka; import java.util.Properties; import kafka.javaapi.producer.Producer; imp ...

  4. Linux OS共享文件

    背景: 相较于windows.unix等OS,Linux因为其开源.安全.稳定.性能优越等优点,已越来越受到互联网的青睐.而我们在学习和使用Linux也就会考虑到Linux机器和我们日常用的windo ...

  5. Thrift总结(一)介绍

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

  6. 做电子商务的七个SEO技巧

    随着电子商务网站的迅速增加,为了适应不断增长的网络客户多样化需求.越来越多的人注意到,从网站上购买既节省了时间和金钱,因此电子商务社区越来越激烈.网站需要具有独特的设计风格和功能,而不是网站内容的不断 ...

  7. win8安装sql2008及设置登陆名问题

    1. .net3.5安装        使用win8系统自带的升级功能无法成功安装.其实Windows8安装文件中已经集了.Net3.5,       (1)此时只需要使用虚拟光驱加载Windows8 ...

  8. Oracle查询数据出来乱码问题?

    为什么Oracle 查询出来的数据会产生乱码?   安装的数据库和客户端编码编码不一致就会产生乱码,要想解决此问题改一下客户端的编码即可 1. select * from table; 如果是这种问题 ...

  9. javascript的setTimeout()与setTimeout()方法用法总结

    setTimeout与setInterval的区别: setTimeout 定义和用法: setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式. 语法: setTimeout(code ...

  10. [BZOJ4008]亚瑟王

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...