资源描述
基于基于TCP通信通信协议的文件的文件传输系系统综述:本次编程中,我们小组从零起点实现了对C#中的Winform窗体应用的创建,简单控件的使用,以及C#语言中的Thread类、FileStream类、Directory类、IPAddress类、Socket类等类的简单使用。我们小组的文件传输系统特点如下:1、基于TCP协议进行服务端和客户端的连接,需提供服务端本机IP地址;2、多个客户端可连接同一服务器;3、服务端可主动选取客户端发送本地文件。程序目前的缺点如下:1、发送文件不能超过100KB,大数据不能分包发(还在解决中);2、客户端不能自动存入文件名和文件格式;。2024/5/21 周二1服务端界面如下:IP为服务端本机IP,端口可自行设计,在启动服务按钮里,可实现从输入的IP和端口实例化一个套接字:2024/5/21 周二2socketWatch=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);/本条语句用来实例化一个套接字IPAddress address=IPAddress.Parse(richTextBox2.Text.Trim();/获得文本框中的IP对象IPEndPoint endPoint=new IPEndPoint(address,int.Parse(richTextBox3.Text.Trim();/创建包含IP和端口号的网络节点对象;上述三条语句可在按下启动服务按钮后创建一个用来负责监听的套接字在创建好了一个套接字过后,服务端便可以监听客户端的连接请求了。我们使用了一个集合的形式用来表示已连接上服务端的客户端相关信息:Dictionary dict=new Dictionary();/做一个集合以便用来包含已有的套接字Dictionary dictThread=new Dictionary();/做一个集合以便用来包含已有的线程在监听到一个客户端的连接请求过后,就将该客户端的信息添加到在线列表控件中直观显示,同时也添加到线程的集合和套接字的集合:Socket sokConnection=socketWatch.Accept();/一旦监听到一个客户端的请求,就返回与该客户端通信的套接字lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString();/向列表控件中添加客户端的IP信息;dict.Add(sokConnection.RemoteEndPoint.ToString(),sokConnection);/将与客户端连接的套接字对象添加到原有套接字集合中;2024/5/21 周二3为了使服务端能够顺利发送文件到客户端,我们写了一个实时用来判断客户端是否连接上服务端的子函数,使用了trycatch语句用来捕获程序运行中的异常情况:2024/5/21 周二4在本次编程中,我们认为最大的困难是文件的打开以及如何将其正确存储到Byte数组中,从而将Byte数组发送至客户端。我们的思路是使用文件流的形式打开要发送的文件,然后使用Read函数从当前流中读取文件数据到一个Byte数组中:其中的txtSelectFile为通过选择文件按钮获取的文件名,并将其存入到的文本框另外,我们还定义了一个Byte数组用来发送文件的信息,即文件名和文件格式以及该文件转化为的字节数。2024/5/21 周二5最后使用BlockCopy函数将arrFile字节数组复制到arrFileSend字节数组中,然后将arrFileSend字节数组发送到客户端:2024/5/21 周二6客户端需求功能:连接到tcp服务器后,被动接受服务器的文件传输请求,接受文件并保存到客户端本地主界面:2024/5/21 周二7流程1、创建socket套接字,获取IP地址对象,绑定套接字到IP和端口上(此处与前面服务器创建负责监听的套接字类似)2、经三次握手连接服务器3、当服务器向此客户端发送文件时弹出对话框接收并保存文件2024/5/21 周二8TextBox Button控件richTextBox1:显示消息;包括连接服务器,与服务器连接成功时也由此返回消息;接收文件时,接收文件名,文件长度消息;文件接收完成时,由此处向用户返回文件保存成功的消息。richTextBox2:输入服务器的IP地址,此处输入的IP文本并由IPAddress ip捕获richTextBox3:同IP的获取方式相同。button1:由此按钮来控制向服务器发送连接请求2024/5/21 周二9接收文件:首先接收文件名及其属性,然后接收到文件大小,弹出对话框后需要根据先前接收到的文件属性来保存文件类型。流程:1、先定义缓存区 2、接收数据到缓存区3、保存文件使用SaveFileDialog控件弹出保存文件对话框4、保存文件加了this的sfd.ShowDialog(this),“另存为”窗口的指针才能被SaveFileDialog的对象调用,若不加this SaveFileDialog 的对象调用的是本类的其他窗口则不会弹出另存为的窗口2024/5/21 周二102024/5/21 周二11以上便是我们小组服务端、客户端程序的实现。最大的困难便是用文件流的形式打开要发送的文件,并存入到字节数组中。这个思路是陈典告诉我们的,很谢谢他。但是我们到目前为止,还没有解决如何将大数据分包发送的问题,因此现阶段的程序版本还不完善。2024/5/21 周二12Thank your watching!2024/5/21 周二13
展开阅读全文