文件传输方法(精选9篇)
文件传输方法 篇1
在网络宽带化、数字化、IP化的推动下, 原有的广电网、电信网、互联网的三网业务逐渐融合。而广播电视网络系统将更多的采用IP技术, 在广播系统中基于单向信道的传输层也越来越多的采用UDP/IP的方式传输, 以达到单双向相结合、简化系统和提高设备通用性等目标。例如数字电视系统中数据广播标准中定义了MPE (多协议封装) 规范就是将UDP/IP数据报封装到MPEG-2-TS流中进行传输的规范, 而DVB-H中使用的DVB-IPDC提出了一整套在网络层实现了全IP化, 通过IP多播技术向大量用户发送数据内容的技术体系, 在CMMB (移动多媒体广播) 、卫星数字电视系统及其他一些无线单向信道中基于UDP/IP传输数据的技术解决方案也开始得到应用。
在这种形势下为了在单向信道中基于IP数据报大规模可靠传输文件, 需要定义基于IP包的单向文件传输协议用于支持各种文档、图像、音视频片段、应用软件、服务广播信息及各种元数据的传输、下载及更新。在这方面国际上比较常见的是FLUTE (File Delivery over Unidirectional Transport) 协议, 而本文提出了一种不同于FLUTE的相对简单, 实现容易的单向文件传输协议。
单向文件传输协议在协议栈所处的位置如图1所示。
本文设计的单向文件传输协议的目标是将一个目录下的所有文件和目录结构通过本文所述的方法进行定义, 封装到UDP/IP协议进行发送。首先为目录建立目录结构信息, 目录结构信息加上索引信息头形成目录数据包作为UDP包的载荷进行发送;然后为文件建立文件信息头, 文件信息头加上文件数据和MD5数据摘要共同作为文件UDP包的载荷进行发送。文件和目录结构封装到IP包中进行传输时的结构设计如图2所示。
图2描述了一个文件数据播发的IP流, 在一个文件数据播发的IP流要求每1秒至少传输1次目录信息描述表, 图中IP包n传输了目录信息描述表, 用于描述整个文件传输的路径结构, 在传输目录信息描述表之前增加目录信息头便于快速查找目录信息描述表以及保证目录信息头与RTP包头结构字节对齐便于对RTP包进行加扰的CA系统进行加扰。
按照文件大小, 将文件数据以分段的方式封装到IP包中进行传输:如果文件大小小于或等于65479字节, 加上16字节的文件信息头再在文件数据后加上MD5数据摘要, 作为1个UDP包的数据段进行发送;如果文件大小大于65479字节, 分割成小于65479字节的文件分段。文件分段大小不得超过65479字节, 文件分段数不得超过65536个, 即单个文件大小应在4, 291, 231, 744字节以内。每个文件文段加上12字节的文件信息头再在分段的文件数据后加上MD5数据摘要, 作为1个UDP包的数据段进行发送。
目录信息由一个或者多个目录信息描述表传输, 每个目录信息描述表之前应加上目录信息头, 目录信息头中的目录信息段总数给出了目录信息描述表的总数, 目录信息描述表编号从0开始递增, 表示了各目录描述信息表之间的先后顺序。文件和目录都被视为一个节点。其中目录信息头包含了包类别、更新序号、节点总数、根节点编号、目录信息描述表长度、目录信息描述表总数、目录信息描述表编号、当前目录信息段包含节点数等信息。目录信息描述表包含了节点编号、父节点编号、节点类型、节点分段数、节点名称、节点数据长度等信息。
目录信息描述表描述了整个路径结构各个节点的相关信息, 利用这些信息接收端可以恢复出完整的路径树结构, 图3为一个实际的例子。
图中给出了“根目录”、“目录1”以及“文件3”三个节点的各项具体参数, 这些参数标明了节点在树状结构的具体位置, 节点可以是文件和目录。对于文件节点, 文件数据包由文件信息头, 分段文件数据和MD5校验数据组成, 文件信息头包含了包类别、更新序号、节点编号、数据段长度等信息。
笔者根据本文介绍的基于IP包的单向文件广播协议设计并实现了文件打包机, 可以将一个路径下的文件打包到UDP包中以轮播的方式播出, 软件界面如图4所示。
在播出系统前端可以使用IPE、复用器及其他网关设备将UDP/IP包封装到信道中进行传输。我们在实验中使用文件打包机将网页HTML文件封装到IP包中, 在CMMB信道中实现了IP包的传输, 并在终端进行接收恢复出数据文件, 系统结构如图5所示。
实现的接收效果如图6所示。
综上所述本文介绍的基于IP包的单向文件广播协议特点有:
每1秒至少传输1次目录信息描述表;
文件信息描述表以树状结构描述整个数据路径结构;
传输目录信息描述表之前增加, 目录信息头便于快速查找目录信息描述表;
目录信息头与RTP包头结构字节对齐便于对RTP包进行加扰的CA系统进行加扰;
文件信息头与RTP包头结构字节对齐便于对RTP包进行加扰的CA系统进行加扰;
文件分段传输的同步和校验机制;
实现简单易行, 便于实际应用。
摘要:本文针对单向广播信道设计定义了一种基于IP包的单向文件传输协议用于支持各种文档、图像、音视频片段、应用软件、服务广播信息及各种元数据的传输、下载及更新, 并简要介绍了该协议的具体实现和实验情况。
关键词:UDP/IP,单向文件广播协议,文件传输
文件传输方法 篇2
这篇文章主要介绍了python实现获取客户机上指定文件并传输到服务器的方法,涉及Python实现C/S架构程序与socket程序的使用技巧,需要的朋友可以参考下
本文实例讲述了python实现获取客户机上指定文件并传输到服务器的方法,分享给大家供大家参考。具体分析如下:
该程序实现了,把目标机器的某个目录(可控)的所有的某种类型文件(可控)全部获取并传到己方的机器上。
1、用了base64的encode(infile,outfile)加密,以及decode(infile,outfile)解密,这是2进制加密解密
2、用zip压缩
3、socket中server.py放到自己这方python server.py,然后client.py放到目标机器,然后python client.py即可
4、本程序设置了获取doc文件,修改extName可以获取其它类型文件
服务器端程序:
代码如下:
# -*- coding: cp936 -*-
import socket
import win32com.client
import os
import zipfile
import codecs
import base64
def main():
HOST = ‘127.0.0.1‘
PORT = 2000
BUF_SIZE = 6553500 #6M
key = ‘ouyang‘
timeout = 5
dicName = “ouyang”
ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
ss.bind((HOST,PORT))
ss.listen(5)
print “wating for conntecting...”
while True:
try:
cs,addr = ss.accept()
socket.setdefaulttimeout(timeout)
cs.send(“200 Connected!”)
#获取加密数据
encode_data = cs.recv(BUF_SIZE)
#把数据写到out.zip文件
tmpfile = open(‘out.tmp‘,‘wb‘)
try:
tmpfile.write(encode_data)
tmpfile.close()
except IOError,e:
print ‘Strange error creating IOError:%s‘ % e
tmpfile.close()
finally:
tmpfile.close()
#base64 decode 2进制 解密 decode(infile,outfile)
tmpfile = open(‘out.tmp‘,‘rb‘)
utfile = open(‘out.zip‘,‘wb‘)
base64.decode(tmpfile,outfile)
tmpfile.close()
outfile.close()
#打开zip文件
zfile = zipfile.ZipFile(‘out.zip‘,‘r‘)
#创建一个文件夹来存放获取的zip文件
if not os.path.exists(dicName):
os.mkdir(dicName)
for f in zfile.namelist():
data = zfile.read(f)
file = open(dicName+os.path.basename(f),‘w+b‘)
file.write(data)
file.close()
print “finished!!!”
zfile.close()
#后续处理 删除临时文件
os.remove(‘out.tmp‘)
cs.close()
except socket.error, e:
print ‘Strange error creating socket:%s‘ % e
cs.close()
ss.close()
except socket.error, e:
print ‘Strange error creating socket:%s‘ % e
ss.close()
if __name__==‘__main__‘:
main()
客户端程序:
代码如下:
# -*- coding: cp936 -*-
import socket
import win32com.client
import win32api
import os
import time
import zipfile
import codecs
import base64
def walk_dir(dir,filelist,extName,topdown=True):
for root, dirs, files in os.walk(dir, topdown):
for name in files:
if (os.path.splitext(os.path.join(root,name)))[-1] == extName:
filelist.append(os.path.join(root,name))
for name in dirs:
if (os.path.splitext(os.path.join(root,name)))[-1] == extName:
filelist.append(os.path.join(root,name))
def main():
HOST = ‘127.0.0.1‘
PORT = 2000
BUF_SIZE = 65535
key = ‘ouyang‘
dicName = “C:Documents and SettingsAdministrator我的文档”
extName = ‘.doc‘
#遍历搜索我的文档的doc类型
try:
filelist = []
walk_dir(dicName,filelist,extName)
except IOError,e:
print “文件处理错误: ” % e
sys.exit(-1)
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
cs.connect((HOST,PORT))
print cs.recv(BUF_SIZE)
#压缩成zip文件
zfile = zipfile.ZipFile(‘in.zip‘,‘w‘,zipfile.ZIP_DEFLATED)
for f in filelist:
zfile.write(f)
zfile.close()
#base 2进制 加密 encode(infile,outfile)
infile = open(‘in.zip‘,‘rb‘)
tmpfile = open(‘in.tmp‘,‘wb‘)
base64.encode(infile,tmpfile)
infile.close()
tmpfile.close()
#send
tmpfile = open(‘in.tmp‘,‘rb‘)
cs.send(tmpfile.read())
tmpfile.close()
#后续处理 删除中间文件
os.remove(‘in.tmp‘)
cs.close()
except socket.error ,e:
print ‘socket 出错啦:‘ % e
cs.close()
if __name__==‘__main__‘:
main()
无线文件传输系统 篇3
本系统主要由发射端模块、接收端模块、中继站模块、电源模块组成, 下面分别论证这几个模块的选择。
1.1 通信方式的论证与选择
方案一:模拟方式通信。利用模拟的方式进行通信, 发射端由音频信号输入, 利用741运放对信号进行放大;再利用调制芯片对信号进行调频处理;接收端由运放、解调芯片组成, 对通过红外传来的信号进行放大、滤波、解调和输出。该方案失真度低, 但是抗干扰能力弱, 在一定距离后噪声明显加大。
方案二:数字方式通信。通过FPGA对信号AD采样, 采样频率为5K, 将一个数据周期分成512份, 根据AD采样值调节第127到第352个时间片段中‘1’的出现个数从而改变占空比。另一方面, 在缩小占空比的时候可以提高瞬间电流峰值, 从而提高瞬间的红外传输距离, 增强了传输效果。但是该方案需要经过门限判决, 在这一过程中会发生门限的不准确, 导致得到的信息丢失, 传输效果差。同时该方法未经过调制, 抗干扰能力弱, 在高频段信号无法发射, 低频段损失严重。并且由于该方法涉及到采样速率的问题, 随着频率的升高, 失真愈发严重。
方案三:模拟, 数字双通道通信。红外二极管按照波段的划分分成很多种, 典型值为940nm和850nm两种工作波段。两种波段在工作时互相不发生干扰或发生极小的干扰, 所以可以基于波段的划分利用两路红外信道分别传输信息。综合以上三种方案, 选择方案三。
1.2 调制方式的论证与选择
方案一:幅度调制。对需要传递的信号进行幅度调制, 即调幅, 将音频信号加载在载波信号上, 形成调幅波, 传递出去, 再通过解调形成原信号。但是方案一在解调方面会有很大的困难。在该通信系统中, 载波频率与调制信号频率相差过小, 不能使用常见的包络检波, 相干解调法电路也实现复杂。
方案二:相位调制。载波的相位对其参考相位的偏离值随调制信号的瞬时值成比例变化。在实际的应用中很少使用调相值, 它主要是用来作为得到调频的一种方法。
方案三:频率调制。对信号进行频率调制, 根据信号幅值的大小让信号形成疏密不同的一列波, 加载音频信号的信息, 通过红外传递出去, 并在接收端进行相应的解调。该方案信道利用率高, 数据传输稳定, 调制解调电路易于实现。综合以上三种方案, 选择方案三。
1.3 温度控制的论证与选择
方案一:用FPGA进行温度信息编辑和显示。但是限于FPGA的并行工作方式, 在顺序逻辑方面尤其是在界面等显示方面有编程的困难。
方案二:单片机。单片机虽然速度达不到很高, 但是在该方案中, 对于温度的采集只需要达到5Hz即可, 对于如此低的频率, 单片机已经可以足够应付, 并且由于单片机C语言的顺序执行的特性, 所以在数据的显示, 用户友好界面方面相较于FPGA有很大的优势。综合考虑采用单片机对温度进行采集、编码、传输, 并对接收到的数据进行处理并显示。
2 系统理论分析与计算
2.1 发射端模块
发射模块包括音频信号放大, 音频信号滤波, 音频信号调制, 温度数字信号的编码, 温度数字信号的传输。
2.1.1 音频信号的放大
将音频信号经过同相运放进行预加重, 放大部分的反馈被分离, 产生的闭环电压增益随着输入频率增加稳定地上升, 在最高音频时增益接近20d B。在频率超过音频范围时, 放大部分限制闭环电压增益。该放大部分可以避免高频的不稳定性, 也可避免可能被滤波器级消除的高频信号被放大器放大。
2.1.2 音频信号的滤波
发射端音频信号的滤波器是由放大IC构成的常规三阶型 (每倍频程18d B) 滤波器, 此滤波器产生低于20k Hz的全音频带宽, 但不会明显损害输入信号质量。放大器的输出直接耦合到下一级。
2.1.3 音频信号的调制
经过锁相环, 对输入的信号进行调频, 并且输出至下一级红外发射二极管, 使发射二极管产生与经过调制后的信号对应的红外信号, 通过红外信道向外传输。
2.1.4 温度数字信号的编码
温度信号采用PCM编码, PCM (脉冲编码调制) 是数字通信的编码方式之一。主要过程是将语音、图像等模拟信号每隔一定时间进行取样, 使其离散化, 同时将抽样值按分层单位四舍五入取整量化, 同时将抽样值按一组二进制码来表示抽样脉冲的幅值。语音PCM的抽样频率为8k Hz, 每个量化样值对应一个8位二进制码, 故语音数字编码信号的速率为8bits×8k Hz=64kb/s。量化噪声随量化级数的增多和级差的缩小而减小。量化级数增多即样值个数增多, 就要求更长的二进制编码。因此, 量化噪声随二进制编码的位数增多而减小, 即随数字编码信号的速率提高而减小。自然界中的声音非常复杂, 波形极其复杂, 通常我们采用的是脉冲代码调制编码, 即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。
2.1.5 温度数字信号的传输
每隔一定时间间隔, 给红外发射管一个高脉冲, 为了提高传输距离, 采用占空比压缩的方式来传输。红外发射管的平均功率很低, 但是瞬时功率可以达到很高, 利用高脉冲压缩时间, 可以传输大功率信号。
2.2 接收端模块
接收端模块包括调制信号的检测, 调制信号的预放大, 调制信号的解调。
2.2.1 调制信号的检测
通过四个红外二极管并联组成检测器, 同时使红外二极管保持在反相偏置连接, 在黑暗的环境下只有很小的漏电电流产生。发射机的红外脉冲使二极管的漏电流增加, 在它们的阴极产生负脉冲。
2.2.2 调制信号的预放大
使用晶体管作为低噪声放大器和缓冲器, 通过负反馈, 使电压增益比保持在较低的值 (约为24d B) , 对灵敏度产生很大的改进。然后经过共射极晶体管进一步放大调制信号。
2.2.3 调制信号的解调
通过锁相环IC CD4046对信号解调。CD4046是通用的CMOS锁相环集成电路。CD4046锁相的意义是相位同步的自动控制, 功能是完成两个电信号相位同步的自动控制闭环系统叫做锁相环, 简称PLL。广泛应用于广播通信、频率合成、自动控制及时钟同步等技术领域。锁相环主要有相位比较器、压控振荡器、低通滤波器三部分组成。如图1所示。
2.3 中继站模块
2.3.1 调制信号的检测
与接收模块的信号检测相同, 用红外接收二极管对红外信号进行检测。
2.3.2 调制信号的调理
将红外接收二极管接收到的信号经过放大和滤波后输出, 再由相应的红外发射管发射, 并使传递方向发生90°翻转, 再传递两米到红外接收端。
3电路与程序设计
3.1电路的设计
3.1.1系统总体框图 (如图2所示)
3.1.2发送端子系统框图与电路原理图
(1) 前置放大器子系统电路。前端放大器用于给输入的信号起到一个放大作用, 可通过电位器实现连续可调, 能更好地控制输入信号。加入了调零电路, 以免给后级带来直流偏置。 (2) 红外发射管电路。用三极管的开关状态来驱动红外二极管的工作。利用调制芯片, 将输入的音频信号转化为调频信号, 示波器显示为疏密变化的方波。
3.1.3接收端子系统框图与电路原理图
(1) 高倍放大器子系统电路 (如图3所示) 。该电路用于放大红外接收端收到的很弱的信号, 该信号也可由多级三极管构成高倍放大。其中NE5532是高性能低噪声双运算放大器集成电路。与很多标准运放相似, 但它具有更好的噪声性能, 优良的输出驱动能力及相当高的小信号带宽, 电源电压范围大等特点。因此很适合应用在高品质和专业音响设备、一起、控制电路及电话通道放大器。
(2) 红外接收模块。被分为放大、解调、功放三个部分组成, 放大即放大接收到的小信号, (注:可采用上述集成运算放大器, 也可采用三极管组成的多级放大器) 。解调部分对前级放大的信号进行解调, 功放部分实现功率的放大, 用于带耳机或者音响等设备。
3.1.4电源
电源由变压部分、滤波部分、稳压部分组成。为整个系统提供±5V或者±12V电压, 确保电路的正常稳定工作。由LM317、LM337构成的可调电压电源。
3.2 程序的设计
3.2.1 程序功能描述与设计思路
(1) 程序功能描述。DS18B20温度传感器, 采集温度信息, 将信息传递给单片机, 单片机将该信号处理为8位信号, 传递给FPGA, FPGA对信号进行编码, 将信息通过红外发射出去, 另一端的红外接收, 并将信息传递给FPGA进行解码。显示部分通过128*64液晶屏幕显示温度信息。
(2) 程序设计思路
3.2.2 程序流程图
(1) 温度发送模块子程序流程图
(2) 温度接收模块子程序流程图
4 测试方案与测试结果
4.1 测试方案
4.1.1硬件测试。 (1) 红外音频传输测试。在接收端通过功放进行放大输出, 比较输入和输出的声音, 凭借人耳判断失真度。 (2) 红外失真度。通过示波器检测输入和输出端的波形并进行比较, 测量是否发生削顶等失真情况。 (3) 温度信息传输测试。通过在接收端进行1602液晶显示将温度在液晶屏上显示出来并与实际温度作比较, 测试温度传输的准确性。
4.1.2硬件软件联调。综合连接元器件, 将所有元器件摆放好, 接通信号源和电源, 检测两侧的波形比较失真度, 信息误码率, 传输速率等信息。
4.2 测试条件与仪器
测试条件:检查多次, 仿真电路和硬件电路必须与系统原理图完全相同, 并且检查无误, 硬件电路保证无虚焊。
测试仪器:高精度的数字毫伏表, 模拟示波器, 数字示波器, 数字万用表, 指针式万用表。
4.3 测试结果及分析
4.3.1 测试结果 (数据)
通信距离测试
800Hz通信测试
当信号为800Hz时, 4V正弦波, 测量8欧姆电压有效值, 性能优异。
4.3.2 测试分析与结论
根据上述测试数据, 可知系统有很好的保真能力和通信能力, 由此可以得出以下结论:信号传输能到达很远距离, 没测过极限值, 不过在四米处仍能清晰听到音乐, 感觉不到有噪声。输入正弦波时, 在远处 (两米外) , 观察波形很稳定, 而且噪声很小, 不到10mv。
摘要:本系统为无线文件传输系统, 用红外发射二极管和红外接收二极管, 定向传输音频信号, 实现远距离的传输, 保证信号的保真。同时可以保证信号的实时传输, 延迟度不超过10s。通过中继站, 可以将信号延长至4m以上的距离并且几乎不失真。该装置分为模拟和数字部分, 模拟部分经过锁相环芯片进行调频, 通过红外信道传输信号, 接收端再通过一个锁相环芯片对模拟信号进行解调, 经过滤波和放大完成音频传输。本系统用于定点定向传输, 点对点的传输方式保证速度和带宽的同时也提高了安全性 (第三方无从获取) 。
关键词:编码解码,红外信道,模拟调制
参考文献
[1]远坂俊昭.测量电子电路设计——滤波器篇[M].科学出版社, 2006.
[2]谭博学, 苗汇静.集成电路原理及应用[M].电子工业出版社, 2005.
[3]何斌.FPGA数字信号处理实现原理及方法[M].清华大学出版社, 2009.
[4]黄智伟.全国大学生电子设计竞赛——电路设计 (第二版) [M].北京航空航天大学出版社, 2011.
[5]黄智伟.全国大学生电子设计竞赛——系统设计[M].北京航空航天大学出版社, 2006.
[6] (美) U.Meyer-Baese, 著.数字信号处理的FPGA实现[M].刘凌, 译.清华大学出版社, 2011.
[7]曹志刚.现代通信原理[M].清华大学出版社, 2008.
[8]董在望.通信电路原理 (第二版) [M].高等教育出版社, 2002.
[9]晏磊.基于FPGA曼彻斯特码数据传输系统的实现[D].郑州解放军信息工程大学.
[10]沈睿, 李驿华.曼彻斯特码编码与解码硬件实现[D].北京航空航天大学, 2002.
联想i908蓝牙文件传输技巧 篇4
如果要共享给别人的文件放在手机内存里,就在“文件共享设定”里将“共享目录”设置成“手机”;如果文件在手机卡中,就改设成“记忆卡”。
存储路径的设定跟共享文件时的设定方式相同,根据自己的需要选择吧,
接收文件有个技巧:当选择“手机”或是“记忆卡”的时候,按OK键是直接选中手机内存主目录或是记忆卡主目录,所以接收文件的时候会发现收到的文件全部都被放入一个名叫“received”的文件夹中(i908移动文件只能一个一个进行,当接受了很多文件后,要全部移动要另一个文件夹里很麻烦)。此时就该在选择的时候用左软键点出“选项”,进入“开启”,然后选择要放入的具体文件夹,这样就可以避免重复的无谓操作了。
基于Socket的网络文件传输 篇5
关键词:上传,下载,Socket编程,传输,客户端
传统的网络编程是一项非常细节化的工作, 程序员必须处理和网络有关的大量细节, 甚至有些需要理解网络相关的硬件知识。但是Java则将这些细节予以屏蔽, 使得操作网络数据传输像操作流一样简单方便。
到底什么是Socket?简单来说, Socket就是网络上的两个程序现实数据交换的双向链路, 即实现客户端和服务端的连接。一个Socket由一个IP地址和一个端口号唯一确定。
Socket的整个通讯过程可以描述如下:Server端Listen (监听) 某个端口是否有连接请求, Client端向Server端发出Connect (连接) 请求, Server端向Clien端发回Accept (接受) 消息。一个连接就建立起来了。Server端和Client端都可以通过Send, Write等方法与对方通信, 见图1。
正是由于Java的Socket网络编程如此简单方便, 因此选择基于Socket实现网络上文件的传输。
1 实现方案
对于客户端而言, 工作首先为连接服务端, 如果连接成功可以从本地磁盘选取任何一个文件上传至服务端或者从服务端下载任何共享的文件。如果上传和下载工作完毕可以断开连接。按下返回按钮可以返回到上级目录。双击鼠标将显示下一级目录和文件。如果双击的是文件, 则不会产生任何结果。当然在此过程中需要考虑各种异常的出现。客户端功能, 见图2。
对于服务端而言, 主要的工作是进行监听, 一旦监听到有请求, 将接收请求并创建一个Socket与客户端建立连接, 并能浏览所有共享的文件, 如果任务完成可以切断连接, 当然在此过程中需要考虑各种异常的出现。服务端功能见图3。
在设计的时候运用设计模式来提高程序的可扩展性。采用了装饰模式, 利用此模式可以扩充一个对象的功能, 当然这种扩展不是通过子类机制扩展, 而是通过另一个新对象动态地、透明地包装现有对象;界面采用了复合模式和策略模式, 利用这两种模式可以使容器中装纳组件和界面的绝对定位。
1.1 客户端的实现
客户端主要用来完成文件的上传、下载和显示目录功能。每执行一个动作需向服务端发送命令。服务端的共享文件在客户端是以目录树显示, 在目录树中如果是文件夹可以双击扩展其节点, 当然还可以返回上一级目录。下面介绍关键类。
1.1.1 类Client Interface
客户端界面类, 客户端界面包括的组件有:3个JText Field实例, 分别用来输入主机地址、用户名和密码。4个按钮分别处理连接、上传、下载和返回上一级目录。1个分隔窗格用来存放服务器的目录树。1个滚动窗格放在分隔窗格中, 分隔窗格中还放有JFile Chooser的一个实例。其中所包含的方法如下。
expansion (int x, int y) :当双击目录树中的目录查看下一级文件和目录时调用此方法, 参数x和y表示鼠标双击的位置, 根据位置得到双击的文件夹, 由JTree的方法get Closet Path For Location (x, y) 实现。将所得到的文件夹的路径传送给服务端, 服务端再将其下的所有文件和目录传送给客户端, 客户端调用accept Files () 方法接收文件并将其显示为一棵目录树。
display () :将界面的各个组件定位, 采用绝对定位, 并定义内部类Action Listener实现Action Listener, 此类是按钮的事件监听器, 并将类Action Listener1的实例注册到各个按钮。
get Conn (String str, int port) :此方法向服务端申请建立连接, 一旦连接成功则将以目录树的形式显示服务端下的目录和文件。传输过程中以所接收的字符是否等于-2来判断, 若为-2表明传输结束。
Down () :用来处理下载文件。接收文件流是以字节数组做缓冲, 并在本地当前目录生成同名文件, 判断接收是否完毕是以接收到的字节数是否等于-1。
up Load () :此方法用来上传文件, 发送up Load命令和所要上传的文件和文件所要保存的位置, 然后建立上传文件的文件流, 以字节数组做缓冲传送给服务端, 以计数变量amount是否小于零来判断文件是否已读完, 最后刷新目录, 将所传文件在目录树上显示。
up () :此方法用来返回上一级目录, 根据变量path Name到当前目录的上一级目录, 然后向服务端发送要求扩展此目录的命令, 即可返回上一级目录。
1.1.2 类Client
顶层类, 设置了观感, 并生成了类Cliet Interface的实例win, 调用其display () 方法。
1.2 服务器端的实现
服务器必须考虑并发性, 为了更进一步提高系统的可伸缩性, 运用线程池来提高程序的效率。下面介绍关键类。
1.2.1 Closed Queue Exception类
继承Exception类, 用户自定义异常。
1.2.2 Blocking Queue类
由工具类Linked List实例list存放线程。其中add () 方法向队列加入线程, notify () 唤醒正在等待的线程, get () 从队列中取线程, 当队列为空时则等待, size () 得到队列的长度, close () 设置线程池状态为false, 并唤醒等待线程, 同时将队列清空。方法add () 、get () 、size () 和close () 需实现同步。
1.2.3 Thread Pool类
此类用于定义线程池, 其中有一个内部类Thread Pool Thread称为工作线程, 由工作线程不停地取队列中的线程运行。属性有:max Pool Size表示线程池的最大值, init Pool Size表示线程池的初始值, is Running表示线程池的状态, request Queue用来存放线程, queue Requests表示队列元素的计数变量。
1.2.4 Thread Pool Thread类
此类是Thread Pool Thread的内部类, 继承了Thread类, 重定义了run () 方法, 并在run () 方法中调用reqeust Queue中的线程并调用其start () 方法, 前提条件是线程池状态为true且当前线程没被中断, 捕捉异常Interrupted Exception。
1.2.5 Listening类
此类用于监听客户端是否发送请求。
构造方法Listening ()
server Socket=new Server Socket (3456) ;
pool=new Thread Pool (5) , 并捕捉异常IOException。
run () 方法
while (true) {
try{
p o o l.s u b m i t R e q u e s t (n e w D i s p o s a l T h r e a d (server Socket.accept () ) ) ;
}
catch (IOException exc) {…}
1.2.6 Diaposal Thread类
此类继承Thread类, 用于处理客户端传送的命令。包含如下方法。
run () 方法:根据不同的命令执行不同的操作。
transfer Files (String file Name) :此方法用来传送文件和目录到客户端, 在传送过程中判断是文件还是目录, 如果是目录则在目录名后加上[str], 文件传输完毕以-2做为结束标志。参数file Name表示在客户端浏览到服务器的当前目录。
1.2.7 Server Interface类
此类用于做服务器端界面。服务端有三个按钮:浏览、开始和停止。浏览按钮用来选择可供用户所共享的文件夹, 默认为d:;当单击“开始”按钮, 创建类Listening的一个实例, 并调用start () 方法;当单击“停止”按钮, 调用线程池的shut Down () 方法。
2 技术解析
利用网络进行文件传输是当今用的非常广的技术, 为更好地提高文件传输的效率和准确率, 在设计过程中用到如下技术:为了提高服务器端效率, 同时也为了实现多用户并发执行, 服务器端采用多线程, 同时应用线程池能提高程序的伸缩性。读写本地文件及对网络的读写操作中都使用了流技术。运用多种设计模式来实现可重用代码、使代码更容易被他人理解、保证代码可靠性。在此设计中合理运用设计模式可以更完美地解决许多问题。在服务端程序中, 自定义了异常, 在传输过程中也充分利用了已有的异常机制, 以保证程序的健壮性。
3 结语
利用Socket实现网络文件传输, 可以实现跨平台, 能更好地实现移植。采用的是图形用户界面, 操作简单。利用多种设计模式使程序的实现更加完美, 服务器端利用线程池提高程序效率。
参考文献
文件传输加密原则及处理方式研究 篇6
很显然, 传统的文件加密技术已经不能满足当今的网络环境。各种各样先进的窃密手段和越来越先进的窃密软件时刻威胁着文件传输的安全性。文件加密方式也伴随着网络安全的日益复杂化在不断的发展着, 从传统的加密技术到当今主流的数据加密技术, 文件加密技术取得了巨大的突破。本文主要分析了传统信息安全防护和当今主流的加密技术, 并对加密算法进行了简单的介绍。
1 传统信息安全防护
传统的企事业单位网络建设的基础架构是防火墙、入侵检测和防病毒软件。很显然, 这种简单的信息安全保护框架远远不能满足现今用户的安全需求, 新型的安全防护手段稳扎稳打, 逐步扩大成为了信息安全防护的主力军。传统的信息安全防护手段不仅构成简单, 而且功能单薄。在计算机网络不断发展的过程中, 安全防护技术不断的更新和发展, 结构复杂性和功能的强大已经远远超过的传统的加密技术[1]。
2 现行的数据加密技术
现如今信息安全防护的主力军中, 文档加密发挥着举足轻重的作用。文档加密技术采用的透明加密技术, 在不改变用户使用习惯的基础上, 强制对数据进行加密。文档加密技术采取的是对数据本身加密, 也就是说, 加密之后, 不管是信息数据正常脱离原来的操作系统, 还是被非法脱离安全环境, 信息数据本身都是安全的。这说明, 经过文档加密技术加密之后的信息数据对环境的依赖性比较小, 安全稳定性更好。磁盘加密技术和驱动级加密技术是我们常用到的文档加密技术。
2.1 磁盘加密技术
磁盘加密技术是指对磁盘进行全盘加密操作, 然后利用主机监控、防水墙等其他防护手段进行整体防护。通过防火墙的围追堵截, 磁盘加密为用户提供一个安全运行环境的方式。它能保证操作系统启动完毕后, 数据本身以明文形式安全的存在于硬盘上。一般来说, 它在对磁盘进行加密时消耗的时间比较长, 延长了整个的时间周期, 从而延长了项目的实施周期, 这是它的弊端;除此之外, 由于磁盘加密技术选择的是全盘加密, 当操作系统出现问题后, 数据的恢复也会比较棘手。所以, 就目前的技术手段而言, 磁盘加密技术很难真正意义上的做到全盘加密。所以, 我们选择了对系统盘不做加密防护, 而是采用其他技术进行安全访问权限控制[2]。
2.2 驱动级加密技术
目前信息加密的主流技术就是驱动级加密技术。它采用的信息防护方式是进程加后缀。这使得用户可以根据实际情况来进行灵活配置, 选择只对重要的数据进行强制加密, 从而使系统的运行效率得到了很大程度的提高。驱动级加密技术选择了对用户的数据本身进行保护, 它运用透明加密技术, 不会改变用户的原有操作, 用户也不会察觉到系统的存在。当数据脱离了安全环境, 用户将无法继续使用该数据, 从而使数据的安全稳定性得到了有效的提高。另外, 驱动级加密技术实现了数据的全生命周期管理, 减少了因数据加密引起的时间周期的延长。通过驱动级加密技术, 使用时间、次数、复制、截屏、录像等操作也可以得到控制, 防止非法的相应操作产生。对文件的内部进行全面的授权管理和数据的外出访问控制也在驱动级加密技术中得到了实现。可以这么说, 驱动级加密技术做到了真正意义上的全方位数据管理。但是, 驱动级加密技术在给用户的数据带来安全的同时, 也一定程度上影响了用户使用数据的便利性。它采用的进程加密技术无法区分个人文件与企业文件数据, 以及对个人电脑与企业文件的并行运行问题, 它也不能做到清晰的区分。它只是对同类文件进行全部加密, 无法做到数据信息的分类管理[3]。
3 文件加密算法
我们常用的加密算法有IDEA算法、RSA算法、AES算法。
3.1 IDEA算法
IDEA算法属于对称加密算法。在对称加密算法中, 数据加密和解密使用的都是同一个密钥, 所以它的数据信息安全性依赖于密钥的安全性。IDEA算法计算量小、加密速度快而且算法公开。但是运用IDEA算法加密的缺点就是数据信息被破解的风险相应较高。
3.2 RSA算法
RSA算法是非对称加密算法, 非对称加密算法的保密性比较好, 而且最终用户也没有交换密钥的必要。它只适合对少量数据进行加密, 不适合对文件加密, 因为它的加密和解密花费时间长、速度慢。RSA算法是以大数分解和素数检测作为理论基础的。与对称加密体制相比, 它的加密速度较慢, 但是不容易被破解。
3.3 AES加密算法
AES加密算法属于对称加密算法, 而且是不可逆的加密算法。它在加密过程中也需要使用密钥。在用户输入明文后, 由系统直接经过加密算法把明文处理成密文。经过加密后的密文是需要密钥才能解密的。它的问世迅速取代了IDEA算法和RSA算法, 成为21实际保护敏感信息的高级算法。与前两者相比, AES加密算法的加密的速度更快, 而且加密强度最高, 同时, 它根本不占用硬件资源[4]。
4 结束语
网络技术日新月异, 由网络信息泄露引起的问题更是层出不穷。这就要求文件传输加密技术需要不断的发展进步。运用加密算法对文件进行加密能够一定程度上的保护信息数据的安全。而现行的加密技术也能够在信息数据的安全问题上给予有力的支持。但是现行的技术虽然能解决大部分问题, 但仍有不能解决的问题或者即将出现的问题, 所以我们需要不断进步不断更新信息安全防护技术, 做好信息安全防护工作。
参考文献
[1]卢秀慧.基于RSA快速加密算法的网络文件加密系统设计[D].中北大学, 2013.
[2]陆燕宁.基于快速加密的文件管理系统的设计与实现[D].大连理工大学, 2013.
[3]丁晨骊.文件加密解密算法研究与实现[D].上海交通大学, 2009.
文件传输方法 篇7
1编程思路
文件传输是把A机的一个文件通过网络传输到B机,并保存到B机。实现该功能的思路是:从A机读取文件,把读到的数据封装到一个数据报包内,然后通过Socket把数据报包发送出去。在B机,使用Socket接收A机发来的数据包,然后把其中的数据写入本地硬盘即可。程序运行后效果如图1所示。
在A机运行发送文件程序,单击选择文件,弹出打开对话框,选择一个文件,确定后程序就会从硬盘读取该文件并发送出去。在B机运行接收文件程序,单击保存文件,弹出保存对话框,把传输过来的文件保存到硬盘上。
2代码实现
实现该程序主要依靠基于UDP协议的Socket编程技术,包括客户端和服务器两个程序。
客户端实现包括4个步骤:建立DatagramSocket,读取磁盘文件,利用文件内容封装数据报包,发送数据报包。详细如下:
(1)建一个类UdpClient.java,在构造方法中构建如图1界面。然后写一个start方法,该方法负责建立一个DatagramSocket对象,并设置好端口号。
(2)给“选择文件”按钮添加一个Action事件,在事件方法中写按钮响应代码:弹出打开对话框,选择文件,根据文件名读取文件内容。
(3)建立一个DatagramPacket对象,即一个数据报包,包的内容是读取的文件内容。
(4)用DatagramSocket对象把数据报包发送出去。
具体代码如下:
这里需要注意两点:第一,因为DatagramPacket对象需要一个字节数组参数存放数据,因此需要把文件内容先读入到一个字节数组buf中。第二,使用while语句循环读取文件内容,制作数据报包。即把一个文件分成若干个数据报包分别发送。这样能传输较大的文件,否则只能传输64KB以内的文件。
服务器实现也需要四个步骤:建立DatagramSocket,接收数据报包,把数据报包内容写入一个临时文件,保存正式的文件。
1)新建一个UdpServer.java类,在构造方法中构建如图1界面。
2)写一个start方法,该方法负责建立DatagramSocket对象,再建立一个DatagramPacket对象。然后循环接收客户端发来的数据报包,并写入到一个临时文件中
3)给“保存文件”按钮添加Aciton事件,在事件方法中写按钮响应代码:打开保存对话框,得到要保存的路径和文件名。
4)把临时文件的内容读取出来,重新写入到保存对话框指定的文件内。
具体代码如下:
文件传输方法 篇8
如今, 随着计算机应用的普及, 许多人也已经将进入Internet作为下一个计算机升级的目标, 而用Internet进行文件传输, 则是计算机联入Internet的一个重要功能之一。因此各种文件传输系统便应运而生, 如邮件, 聊天工具等。这些软件在使用上各有所长, 但与此同时, 其自身仍存在缺点和局限性, 这些都给文件传输带来了很多不便。首先, 对远程服务器的依赖导致有些文件传输工具不能完全实现点对点的文件传输, 甚至对文件的安全造成了威胁。其次, 这些传输工具只适宜传输体积较小的文件, 如果传输的文件体积过大, 则会耗费很长时间, 进而导致资源的浪费, 倘若网络速度不理想, 更有可能会导致传输中断。因此, 开发一个功能简单, 易于操作, 传输效率高的文件传输工具势在必行。
2 环境与相关开发技术
2.1 Sock网络编程原理
套接字 (socket) 是一种网络编程接口, 实际上就是一个通信端点, 提供了发送和接收数据的机制。而Winsock是基于Windows操作系统下的网络编程接口, 也就是基于Socket模型的API。而最简单的一对一的CS结构的通信程序, 就只有两个端点, 即两个套接字 (Socket) , 一个在Server端, 另一个在Client端, 这两个套接字就在CS间建立了双向数据传送的连接。每个套接字都有一个套接字地址, 通常是IP和端口的组合。
Socket分为阻塞模式和非阻塞模式:
阻塞模式是指在指定套接字上调用函数执行操作时, 在没有完成操作之前, 函数不会立即返回。例如, 服务器程序在阻塞模式下调用accept () 函数时将会阻塞服务器线程, 直至接收到一个来自客户端的连接请求。默认创建的套接字为阻塞模式。
非阻塞模式是指在指定套接字上调用函数执行操作时, 无论操作是否完成, 函数都会立即返回。例如, 在非阻塞模式下调用recv () 函数时, 程序会直接读取网络缓冲区中的数据, 无论是否读到数据, 函数都会立即返回, 而不会一直挂在此函数的调用上。在并发线程模型中, 服务器程序中使用了一个线程来等待客户端的连接请求, 然后创建新线程与客户端进行通信。因为每个客户端都拥有一个专门的通信服务线程, 所以能够很及时地与服务器程序进行通信, 不需要等待其他客户端通信结束。因此本设计采用了socket的非阻塞模式。
2.2 c/s结构
C/S (Client/Server) 结构, 它是一种软件系统体系结构, 也就是客户机/服务器结构。它可以充分利用两端硬件环境的优势, 将任务合理分配到Client端和Server端来实现。
C/S结构的基本原则是“功能分布”原则, 也就是将计算机应用任务分解成多个子任务, 由多台计算机分工完成。客户端完成数据处理, 数据表示以及用户接口功能;服务器端完成DBMS的核心功能。这种客户请求服务、服务器提供服务的处理方式是一种新型的计算机应用模式。
现在已经普遍采用3层C/S结构, 与传统的二层结构相比, 三层C/S结构具有以下优点:首先, 合理地划分三层结构的功能, 从而使整个系统的逻辑结构更为清晰, 提高系统和软件的可维护性和可扩展性;其次, 可以更灵活地选用相应的平台和硬件系统, 应用的各层可以并行开发或者各自选择最适合的开发语言。
3 文件传输工具的设计流程
3.1 文件传输工具的总体流程
3.1.1 接收端的启动
创建监听线程:
(1) 创建Socket, 采用非阻塞模式。
(2) 通过bind () 函数绑定IP地址和端口号。
(3) 通过listen () 函数使其处于监听状态。
3.1.2 发送端的连接
(1) 创建Socket。
(2) 通过connect () 函数向接收端发送连接请求。
3.2 文件传输工具的具体设计
3.2.1 发送端
(1) 创建一个连接线程:1) 创建socket () 。2) 根据用户界面输入的IP地址, 调用connect () 向接收端发出连接请求。3) 连接建立后弹出对话框提示连接已建立。
(2) 选定文件后, 创建一个对文件进行分包的线程:1) 自定义一个合适的分包大小f_size。2) 根据file.length得到文件的总大小, 通过file.length/f_size求出该文件的分包数f_number。3) 通过file.length%f_size求出该文件最后一包的大小flast_size。4) 通过socket将文件基本信息 (文件名f_name, 文件大小f_size) 和文件分包信息 (分包大小f_size, 分包数f_number, 最后一包大小flast_size) 发送给接收端。
(3) 创建一个发送文件数据的线程:
3.2.2 接收端
在第一个阶段, 接收端作为服务器, 负责监听客户端提出的连接请求, 并且用socket的非阻塞模式。
(1) 创建一个监听线程:1) 创建socket () 。2) 通过WSAEventselect () 设置socket为非阻塞模式。3) 通过bing () 绑定主机IP地址和端口号。4) 通过listen () 使其处于监听模式。5) 通过循环while (1)
{SOCKET sock Conn=accept (sock Srv, (SOCKADDR*) &addr Client, &len) ;}
使得发送端提出的连接请求能够被马上响应, 并且新创建一个socket与发送端进行通信。
注:监听线程始终开启, 知道程序结束时才退出, 全程监听发送端的连接请求。
(2) 创建一个接收文件信息的线程:
以步骤1中新创建的socket为该线程参数, 通过调用recv () 接收发送端发送的文件基本信息, 并将文件名, 文件大小显示在界面上。
(3) 当接收端接收到该文件的基本信息后, 创建一个函数, 用来做接收文件的准备工作。
(4) 创建一个接收文件数据线程。
(5) 创建一个函数判断文件是否接收完全。
4 主要实现技术
4.1 文件的分块
网络应用程序是一种在不同系统的进程间通过网络通信协议进行的进程间的通信问题。在Windows编程中是通过套接字socket来编程的, socket分为阻塞模式和非阻塞模式, 本设计为了提高数据的传输效率采用了socket的非阻塞模式。当文件数据很大时, 使用套接字socket进行传输往往需要花费较长的时间, 容易出错, 因此我们将把文件分为N块, 进行数据的分块传输。
4.2 文件的分块传输
在传统算法中, sender将主动把分包后的数据块依次传送至receiver, 而receiver只负责接收, 但是由于sender并不能保证发送的数据块receiver都已正确接收, 所以需receiver发送确认信号, 从而影响传输效率。因此在本设计中receiver将主动向sender索要分包数据, 而sender只需按接收到的分包信息发送相应的分包数据即可, 直至receiver发送接收完毕信息为止。因此, 此次设计将分为两大部分。
第一部分:receiver作为服务器, sender作为客户端。receiver创建socket后则处于监听状态, 当sender发现有文件需要传输时则首先向receiver提出连接请求, receiver监听到sender提出的连接请求后, 马上响应并创建新的socket与sender进行通信。连接成功建立后, sender向receiver发送文件的基本信息 (包括分包信息) , 而receiver继续循环监听。
第二部分:s e n d e r在发出文件信息后, 充当服务器, 监听receiver。receiver接收到文件信息后, 创建socket主动向sender发送分包信息索要分包数据, 而sender接收到分包信息后将其解析并发送相应的分包数据。直至receiver检测到所有分包数据都已接收, 向sender发送结束信息。
4.3 确认所有分包都已接收
为解决这个问题, 将自定义一个分包信息结构体, 其中包括分包ID, 分包大小, 以及分包的接收状态 (0:未接收, 1:正在接收, 2:已接受) 。在sender进行文件分包时, 会初始化文件信息, 其中包括记录文件的分包数, 分包的固定大小, 及最后一个分包的大小。同时也会初始化每个分包信息。
receiver在接收到文件信息之后, 根据文件信息中提供的分包数申请等大的分包信息缓存区。并初始化每个分包的接收状态为0, 表示尚未接收。当receiver取得分包ID并向sender发送时, 修改此分包的接收状态为1, 表示正在接收。当receiver正确接收此分包后, 修改分包接收状态为2, 表示已接收。当receiver判断所有分包的接收状态都为2时, 即表示所有分包都已接收。
4.4 多线程文件传输
一个采用了多线程技术的应用程序可以更好地利用系统资源。其主要优势在于充分利用了CPU的空闲时间片, 可以用尽可能少的时间来对用户的要求做出响应, 使得进程的整体运行效率得到较大提高, 同时增强了应用程序的灵活性。
由于本设计采用的是Socket的非阻塞模式, 采用多线程, 可提高cpu利用率。于是, 在文件的传输过程中, 创建了3个线程, 同时接收文件分包数据, 创建线程后, 一个应用程序可以同时有多个线程一起访问, 因此在设计中用了大量的信号量和事件机制, 以避免访存冲突。
5 具体实现过程
源程序的组成:在本设计中有两个程序, 分别为s e nd e r和receiver。
sender主要有三个部分, 一个是sender Dlg, 用于和用户实现交互。负责在程序运行时创建Monitor Image线程, 监听文件缓冲区中的文件状况, 另外负责将选中的文件加入文件缓冲区中。同时还会在界面上显示出文件的基本信息以及发送状态。第二个是Trans Image Buffer, 主要用于初始化文件缓冲区, 实现文件分包信息的添加和提取。第三个是Image Sender, 用于实现文件的分包以及发送等。
receiver中也包括三个部分:
一个是r e c e i v e r D l g, 主要负责在程序开始运行时创建Monitor Sender线程, 监听sender端的连接请求, 一旦监听到连接请求, 则立即响应, 之后循环监听。另外会实时显示文件的基本信息以及接收状态。
第二个是Trans Image Buffer, 同样是用于初始化文件缓冲区, 实现文件分包的添加和提取等。第三个是Image Receiver, 用于实现文件的分块接收以及文件存储等
6 总结
在编程之前, 首先要对整个系统有一个很好的理解, 对于系统的功能和需求分析透彻之后, 利用软件工程的思想, 合理的进行开发设计。
摘要:随着计算机技术的迅猛发展, 人们通过Internet进行学习, 工作, 在此过程中, 文件传输成为了最常用的服务之一。而多线程文件传输可以有效地提高文件的传输速度和传输效率。本次设计的文件传输工具是在Windows操作系统下, 于Visual Studio 2012环境中用Win Sock控件实现的, 是基于TCP/IP协议的C/S模式, 在服务器和客户端分别以Socket为中心进行编程, 其中服务器端和客户端的界面设计采用Windows MFC框架, 分别有文件发送模块和文件接收模块。该设计成功的实现了服务器和客户端的文件。成功的实现了服务器和客户端的文件传输。
关键词:C/S结构,点对点,Socket连接,多线程多种格式的文件
参考文献
[1]钱能.C++程序设计教程[M].北京:清华大学出版社, 2008:18-19.
[2]候捷.深入浅出MFC[M].北京:华中科技大学出版社, 2009:32-33.
[3]Anthony Jones.Jim Ohlund.Windows网络编程[M].北京:清华大学出版社.
文件传输方法 篇9
随着集群、巨型计算机系统的发展, 计算机的计算能力得到了飞速的提升, 网格的兴起, 为进一步整合各种资源 (主要是计算资源) 提供了新的途径。在现有网络的情况下, 如何方便快捷地传输、部署数据, 已经成了一个普遍关注的问题。
一直以来, 我们所熟悉的数据传输模型大多都是C/S模式, 有较好的跨平台性, 但是在传输性能上并不理想, 而且使用模式也比较单一, 使得一些情况下数据的传输和部署很不方便。网格技术的发展推动了相关领域内一些新的标准和模型的出台, 在数据传输方面, Globus项目组开发的数据传输协议GridFTP使数据传输的性能得到了明显的提高, 并且在GridFTP的上层和WebService相结合, 提出了RFT (ReliableFileTransfer) 服务的概念, 进一步提高了数据传输的可靠性。GridFTP数据传输模型具备了较好的传输性能, 支持异构的系统, 并且使用方便。[1,2]
2 GridFTP协议功能及特点
GridFTP基于标准的FTP协议, 标准的FTP实现一般只支持其中一个子集, 为了使网格数据传输协议具有更好的适应性, GridFTP除了应具有普遍使用的数据传输协议所提供的基本功能外, 还必须是可扩展的。为了满足网格的需要, GridFTP在FTP的基础上增加了如下一些新的特征, 其中一些已经成为标准。
(1) 自动调整TCP缓冲/窗口大小。手工方式设置TCP缓冲/窗口大小容易出错, 且对用户要求较高, 因此GridFTP对标准的FTP指令集及数据信道协议进行了扩展, 针对具体的文件大小及类型, 使GridFTP支持手动或自动设置大文件以及小文件集合的TCP缓冲大小, 从而有效地提高了数据传输性能。
(2) 支持GSI及Kerberos安全机制。传输或存取文件时, 灵活可靠的安全鉴别、完整性检查、健壮性及保密性都非常重要。当用户要求控制不同层次上的数据完整性及保密性的设定时, GridFTP必须支持GSI (CridSecurityInfrastructure) 及Kerberos认证。GSI支持用户代理、资源代理、认证机构和协议的实现, 是Globus的安全基础构件包, 是保证网格计算安全性的核心。
(3) 第三方控制的数据传输。为了管理许多大型数据集, GridFTP提供了经过鉴别的由第三方控制的数据传输功能。这种功能允许用户或应用程序启动、监视和控制其他2个地点的数据传输, 为使用多个地点的资源提供了保障。
(4) 并行数据传输。并行数据传输就是在一个数据服务器上, 将数据文件分段后在多种数据连接上传输数据。在广域网中, 使用多个并行的TCP流与使用单一的TCP流相比能有效地提高数据传输的总带宽。GridFTP通过指令及数据信道的扩展支持并行数据传输。
(5) 条状数据传输。条状数据传输是指应用程序使用多个TCP流来传输分布在多个服务器上的数据。在网格环境中, 大规模的数据可分布放置在多个存储点上。GridFTP能启动条状传输, 条状传输可以在并行传输的基础上进一步提高总带宽及数据传输速度。
(6) 部分文件传输。许多应用程序只需要访问某个远程文件的一部分, 而标准的FTP只能传输整个文件或从文件某个特殊位置开始的剩余部分, 因此需要特定的数据传输支持。GridFTP引入新的FTP指令以支持从一个文件的任意位置开始传输数据。
(7) 支持可靠的数据传输及数据重传。对于许多处理数据的应用程序来说, 保证数据传输的可靠性很重要, 处理短暂的数据传输故障和服务器故障等是不可缺少的容错手段。GridFTP支持可靠的数据传输及数据重传, 并把它扩展到新的数据通道协议中。[3]
3 GridFTP的数据传输模型
GridFTP是网格环境中数据管理模块的核心, 为其它上层的功能如RFT、GASS (GlobalAccessto SecondaryStorage, 辅助存储全局访问) 和RSL (ReplicaLocationService, 副本定位服务) 提供了底层的支持。Globus中为进一步提高数据传输的可靠性, 在GridFTP的上层引入了RFT服务和后台数据库的支持, 模型[4]的结构如图1所示。
Client是用户控制传输的客户端, Globus中分别为GridFTP和RFT服务提供了各自的客户端。
RFT服务是一个网格服务 (Grid Service) , 它负责接收客户端的传输请求, 将请求存入数据库, 控制GridFTP服务器进行数据传输, 保存传输状态信息, 向用户返回传输状态[5]。
数据库用来存储客户端发来的传输请求和文件传输的状态, 当发生网络故障或其它原因导致传输失败后, 在RFT处理新的传输请求或重启RFT服务之后可以根据数据库中存储的信息进行恢复, 提高传输的可靠性。
GridFTP服务器负责底层的数据传输。
Client与GridFTP服务器直接交互进行本地上传和下载的方式使用很普遍。RFT服务就是经过扩展的Web Service, Grid Service与Web Service的主要区别是前者加入了两项扩展:一个是Grid Service的有效生命周期, 第二个是Grid Service在WSDL的基础上扩展了serviceData元素, 描述Grid Service的信息和状态。每个Grid Service有一个相关的服务数据元素 (ServiceData Element, SDE) 集, 用户还可以定义自己的SDE。在RFT服务的实现中自定义了七个SDE[6], 它们分别描述了RFT的版本和作业传输状态等信息。针对这些SDE, RFT提供了两种使用模式:push, pull。
(1) push:RFT服务器端实现了一个发送通知的接口, 可以主动提供细粒度的状态变化通知, 客户端需要实现相应的接收通知接口, 来接收和处理通知, 这种模式主要用在客户端要求对传输的进度进行实时的精确反馈的情况下。
(2) pull:与push不同, 服务器端并不主动发送通知, 而是客户端根据需要调用OGSI (Open Grid Services Infrastructure) 规范中定义的FindServiceData () 方法, 来获得指定的服务数据, 使用这种模式的时候, 客户端在提交传输请求之后便可以断开连接甚至关机, 在需要的时候再进行状态的查询。在pull模式中, 由于客户端断开的时间不确定, 所以RFT服务实例的生命周期被定义为indefinite, 这样就需要客户端自己在用完服务实例之后进行销毁。
4 利用GridFTP实现简单的文件传输
4.1 GridFTP服务器的配置
GridFTP服务器的配置共分为三步, 下面的命令是以root用户执行。
4.1.1 配置GridFTP服务器
GridFTP启动首先从MYMGLOBUS_LOCATION/etc/gridftp.conf开始, 如果找不到则会从/etc/grid-security/gridftp.conf开始, 首先创建配置文件gridftp.conf如下:
port 5000
allow_anonymous 1
anonymous_user eden
banner "Welcome!"
其次配置环境:
[root@edenggg root]MYMGLOBUS_LOCATION/etc/gloubs-user-env.sh
4.1.2 启动GridFTP服务器
globus-gridftp-server -c MYMGLOBUS_LOCATION/etc/gridftp.conf:/etc/grid-security/gridftp.conf
此命令在MYMGLOBUS-LOCATION/sbin下, 也可以直接启动GridFTP服务器, 运行命令:
MYMGLOBUS_LOCATION/sbin/globus-gridftp-server -s -p 5000 //可以自己指定端口号
4.1.3 测试ftp服务器是否启动成功
telnet localhost 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 gridftp Server edenggg 2.0 (gcc32dbg, 1114447190-1) ready.
// 220表示GridFTP启动成功。
如果测试成功了, 下面就可以传送文件了。
4.2 实现文件的传输
网格文件的传输可以是单机文件传输或局域网内的文件传输, 下面分别介绍这两种情况下的文件传输。
4.2.1 单机文件传输
在一台电脑内实现传输文件, 那么这台电脑即要做服务器, 也要做客户端。首先在Linux上正确的安装与配置GT4环境, 设置gridftp-mapfile文件, 以root用户身份命令配置环境:
[root@edenggg root]MYMGLOBUS_LOCATION/etc/gloubs-user-env.sh
以root用户启动服务器:
[root@edenggg root]MYMGLOBUS_LOCATION/sbin/globus-gridftp-server -s -p 5000
再以普通用户下载文件, 以eden用户进行简单的文件传输, 执行下面的命令配置环境:
[eden@edenggg root]MYMGLOBUS_LOCATION/etc/gloubs-user-env.sh
启动代理:
[eden@edenggg root]MYMgrid-proxy-init -verify-debug
从服务器上面下载文件:
[eden@edenggg root]MYM globus-url-copy -vb -dbg gsiftp://edenggg:5000/mnt/hgfs/share/gt4.iso gsiftp://edenggg/home/eden/
向服务器上传文件:
[eden@edenggg root]MYM globus-url-copy -vb -dbg gsiftp://edenggg/home/eden/gt4.iso gsiftp://edenggg:5000/mnt/hgfs/share/
注意:不管下载还是上传都要使eden用户对操作文件夹有可写的权限, 否则在传输时会出现无法写入的错误, 最好将文件下载或上传到/home/eden/文件夹下。
4.2.2 局域网内传送文件
正确配置两台电脑, 一台电脑做服务器 (Server) , 另一台电脑做客户端 (Client) 。Client电脑把需要认证的user证书 (usercert_request.pem) 传给Server电脑 (不管通过什么方法) , Server电脑通过grid-ca-sign-in命令进行认证, 生成的证书再传给Client电脑。
(1) Server电脑启动GridFTP服务。打开user_request.pem, 将里面的两条信息以root用户将信息添加到grid-mapfile中, 如下:
/O=Grid/OU=GlobusTest/OU=simpleCA-edenggg/CN=edenggg和/home/eden/.globus/usercert.pem
“/O=Grid/OU=GlobusTest/OU=simpleCA-edenggg/CN=edenggg” eden
以root用户配置环境:
[root@edenggg root]MYMGLOBUS_LOCATION/etc/gloubs-user-env.sh
以root用户启动服务器:
[root@edenggg root]MYMGLOBUS_LOCATION/sbin/globus-gridftp-server -s -p 5000
(2) Client电脑将从Server收到的经认证过的证书放到/home/eden/.Globus/ , 并覆盖usercert.pem。Client电脑上的user用户启动代理。
配置环境:
[eden@edenggg root]MYMGLOBUS_LOCATION/etc/gloubs-user-env.sh
启动代理:
[eden@edenggg root]MYMgrid-proxy-init -debug -verify
现在就可以从Server电脑上下载和上传文件了, 当然也可以是文件夹。不过我们还要知道Server电脑的主机名或IP地址以及GridFTP服务的端口号。例如:
[eden@edenggg root]MYM globus-url-copy -vb -dbg gsiftp:// Server:5000/mnt/hgfs/share/gt4.iso gsiftp:// Client/home/eden/
Server:5000代表服务器的主机名或者IP和端口号
Client代表客户机的主机名
5 结束语
高性能数据传输服务是数据网格的重要组成部分, 它应该是基于标准协议和方便好用的, 并且应具有高效、安全、强壮的传输功能。GridFTP是一种功能较全面、性能较好的、在标准FTP协议上扩展的数据传输协议。本文通过分析GridFTP协议的特性, 并在网格环境下实现简单文件传输功能, 验证了GridFTP的数据传输模型能够满足网格环境中海量数据传输服务的需要, 这为网格技术的发展奠定了重要的基础。
参考文献
[1]桂小林.网格技术导论.北京:北京邮电大学出版社, 2005
[2]夏靖波, 刘颖, 汪胜荣.网格原理与开发.西安:西安电子科技大学出版社, 2006
[3]刘鹏展, 刘亮.GridFTP性能分析.计算机工程与应用, 2005; (15) :138—140
[4]姜国庆, 黄永忠, 牛向华.网格环境下数据传输模型的研究.微计算机信息, 2005;21 (10) :58—60
[5]刘文杰, 何涛, 肖浩.基于Globus的网格应用关键技术研究.计算机工程与设计, 2006;27 (19) :3606—3608
【文件传输方法】推荐阅读:
文件安全传输09-29
网络文件传输系统06-21
传输方法09-01
安全传输方法12-03
立体电视传输方法研究10-04
智能化数据传输手段选择方法的研究01-20
音频文件处理方法06-25
多文件编程方法总结07-10
电脑文件整理的方法12-28