基于socket的文件传输软件的设计与实现.docx
- 文档编号:1806511
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:14
- 大小:234.44KB
基于socket的文件传输软件的设计与实现.docx
《基于socket的文件传输软件的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于socket的文件传输软件的设计与实现.docx(14页珍藏版)》请在冰豆网上搜索。
基于socket的文件传输软件的设计与实现
哈尔滨工业大学课程结业报告
姓名:
学号:
所学专业:
课程名称:
提交日期:
基于socket套接字的文件传输软件的设计与实现
1.概述
TCP/IP(TransmissionControlProtocol/InternetProtocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP协议使用范围极广,是目前异种网络通信使用的唯一协议体系,适用于连接多种机型,既可用于局域网,又可用于广域网,许多厂商的计算机操作系统和网络操作系统产品都采用或含有TCP/IP协议。
TCP/IP协议已成为目前事实上的国际标准和工业标准。
基于TCP/IP协议组的网络模型分为应用层、传输层、网络层、链路层和物理层这样五个层次。
TCP/IP协议组位于应用程序和硬件之间,指挥数据在网络各层中传递。
其中传输层的协议包括传输控制协议(TCP)和用户数据报协议(UDP),它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,UDP提供简单的无连接服务。
传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认和丢失重传等。
TCP协议是面向连接的协议,它提供可靠的字节流服务,在进行数据传输之前必须先建立连接,经三次握手确定后才开始数据传送。
UDP进行数据报传输使用的是不可靠、无连接的协议。
网络层包括互连网协议IP,互连网控制报文协议ICMP和互连网组管理协议IGMP。
其中IP协议完成大部分的工作,负责数据传输和路由的选择等。
IP报头中的地址和网卡相联系(具体还涉及地址解析和反向地址解析协议),TCP、UDP报头中的端口号侧对应着网络主机上不同的程序。
TCP/IP体系结构如图一所示:
图一TCP/IP体系结构
Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
尽管TCP/IP协议的名称中只有TCP这个协议名,但是在TCP/IP的传输层同时存在TCP和UDP两个协议。
TCP是一种面向连接的保证可靠传输的协议。
通过TCP协议传输,得到的是一个顺序的无差错的数据流。
发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是serversocket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
本文在Scoket原理基础上,基于.NET平台,利用线程池技术,设计并实现了分别面向TCP和UDP的可靠文件传输软件。
2.系统体系结构
根据采用的协议不同,本软件分为基于TCP文件传输和基于UDP的可靠文件传输。
在TCP/IP网络中两个进程间的相互作用的主机模式是C/S。
在操作过程中采取的是主动请示方式:
首先服务器方要先启动,并根据请示提供相应服务:
1、打开一通信通道并告知本地主机,它在某一个公认地址上接收客户请求;
2、等待客户请求到达该端口;
3、接收到重复服务请求,处理该请求并发送应答信号;
4、返回第2步,等待另一客户请求;
5、关闭服务器。
客户端:
1、打开一通信通道,并连接到服务器所在主机的特定端口;
2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……
3、请求结束后关闭通信通道并终止。
2.1面向TCP系统调用时序图
图二面向TCP的系统时序图
2.2面向UDP系统调用时序图
图三面向UDP的系统时序图
3.功能实现
3.1公共类设计
软件设计时,TCP和UDP的服务器端为统一界面,客户端为统一界面。
即服务器端既能够接受TCP连接,也能通过UDP进行接收;客户端可以通过TCP和UDP进行传输。
3.1.1IP地址操作类
1、IPAddress类
在该类中有一个 Parse()方法,可以把点分的十进制IP表示转化IPAddress类,方法如下:
IPAddressaddress=IPAddress.Parse(“192.168.100.39”);
IPAddress提供4个只读字段
Any 用于代表本地系统可用的任何IP地址
Broadcase用于代表本地网络的IP广播地址
Loopback用于代表系统的回送地址
None用于代表系统上没有网络接口
其中IPAddress.Any最常用可以用来表示本机上所有的IP地址,这对于socket服务进行侦听时便使用,不用对每个IP进行侦听了。
2、IPEndPoint类
通过二种构造方法来创建IPEndPoint类:
a、IPEndPoint(longaddress,intport)
b、IPEndPoint(IPAddressaddress,intport)
它有四个属性:
Address
AddressFamily
Port
MaxPort
MinPort
IPEndPoint是一个IP地址和端口的绑定,可以代表一个服务,用来Socket通讯。
3.1.2DNS相关类
DNS类有四个静态方法,来获取主机DNS相关信息:
1、GetHostName()
通过Dns.GetHostName()可以获得本地计算机的主机名
2、GetHostByName()
根据主机名称,返回一个IPHostEntry对象:
IPHostEntryGetHostByName(stringhostName)。
其中IPHostEntry把一个
DNS主机名与一个别名和IP地址的数组相关联,包含三个属性:
AddressList:
一个IPAddress对象的数组
Aliases:
一个字符串对象数组
HostName:
一个用于主机名的字符串对象
3、GetHostByAddress()
类似于GetHostByName(),只不过这里的参数是IP地址,而不是主机名,也返回一个IPHostEntry对象。
IPHostEntryGetHostByAddress(IPAddressaddress)
IPHostEntryGetHostByAddress(stringaddress)
4、Resolve()
当不知道输入的远程主机的地址是哪种格式时(主机名或IP地址),用以上的二种方法来实现,可能还要通过判断客户输入的格式,才能正确使用,但Dns类提供一更简单的方法Resolve(),该方法可以接受或者是主机名格式或者是IP地址格式的任何一种地址,并返回IPHostEntry对象。
3.2TCP文件传输
3.2.1服务器端
1、创建IPEndPoint实例,用于Socket侦听时绑定:
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 7000);
2、创建套接字实例:
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 这里创建的时候用ProtocolType.Tcp,表示建立一个面向连接(TCP)的Socket。
3、将所创建的套接字与IPEndPoint绑定:
serverSocket.Bind(ipep)。
4、设置套接字为收听模式:
serverSocket.Listen(10)。
5、在套接字上接收接入的连接
在此使用.net的线程池类,默认情况下创建25个线程。
从线城池中获取一个线程来处理客户端请求。
ThreadPool.QueueUserWorkItem。
6、在套接字上接受客户端发送的信息
部分代码:
BinaryReaderreader=newBinaryReader(client.GetStream());
stringfilename=reader.ReadString();
longtotal=reader.ReadInt64();
stringsaveAs=GetSaveFile(filename);
FileStreamfs=File.Create(saveAs);
try
{
byte[]buffer=newbyte[8192];
intlen;
while(total>0)
{
len=reader.Read(buffer,0,8192);
if(len==0)
thrownewIOException("发送方中止了连接");
fs.Write(buffer,0,len);
}
}
3.2.2客户端
1、创建IPEndPoint实例和套接字;
2、将套接字连接到远程服务器;
clientSocket.Connect(ipep)
3、发送信息
FileInfofi=newFileInfo(textBox1.Text);
writer.Write(fi.Name);
writer.Write(fi.Length);
FileStreamfs=fi.OpenRead();
longtotal=fi.Length;
byte[]buffer=newbyte[8192];
intlen;
while((len=fs.Read(buffer,0,8192))!
=0)
{
writer.Write(buffer,0,len);
}
客户端使用openFileDialog类选择文件,然后向服务器端传送文件长度和文件名,最后将需要传送的文件切割成以单位为8k的数据块进行传送。
服务器端使用SaveFileDialog类选择存储文件的位置,然后接受客户端发送的文件名和文件长度,然后进行小数据块接受,使用循环,直至客户端发送完毕,服务器端在接受客户端连接请求时开辟了一个内存池。
面向连接的程序流程图如下所示:
图四面向TCP的程序流程图
3.3UDP文件传输
TCP是面向连接的,所以用TCP传输文件不会丢包。
UDP是非面向连接的,所以UDP是不可靠的,用它传输文件,要保证不丢包,就需要额外代码来保障。
本文采用的是在接受文件端来检测,当开始接收文件,收到一个数据包后,如果等待超过了一定时间后都没有收到数据包,就给发送方发送一个新的请求,要求继续发送文件,直到文件全部接收完成。
流程图如下:
图五UDP传输流程
3.3.1服务器端
在UDP服务器端设计过程中,部分步骤和实现代码与TCP相似,在此不再赘述。
基本的实现步骤:
1、创建一个socket,用函数socket();
2、绑定IP地址、端口等信息到socket上,用函数bind();
3、循环接收数据,用函数recvfrom();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 socket 文件传输 软件 设计 实现