文件传输程序设计讲解
基于IPv6的网络编程(文件传输,聊天)

课程设计报告课程:ipv6学号:20082212285 姓名:付希善班级:网络0802 教师:李阿丽鲁东大学信息科学与工程学院设计名称与内容一、Winsock编程技术Windows Sockets是Windows下网络编程的规范,是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。
经过不断完善它已成为Windows 网络编程的事实上的标准。
Winsock是windows应用程序与下层网络协议之间的交互接口,通过socket,可以很容易的实现应用程序的网络连接。
Winsock 也是Windows 进行网络通信编程的API接口。
在网络编程中最常用的方案是客户/服务器模式,首先由服务器在指定的端口开通指定的服务,然后在客户机上通过指定服务器地址、服务端口来连接服务器以获取指定的服务。
二、聊天程序的功能及其相关网络协议使用可靠的TCP来实现端到端的连接,使用到的协议是TCP协议。
采用的体系结构风格是服务器/客户端风格(C/S)。
服务器端建立socket连接,然后监听端口,等待客户端的连接。
在客户端连接之前,消息编辑窗口都设置为不可编辑状态。
当有客户端连接后,消息编辑窗口才设置为可编辑状态。
本程序的功能就是实现简单的基于TCP 协议的聊天,即简单的消息发送。
三、聊天程序流程图和设计方案1)聊天程序流程图2)设计方案服务器端的设计:服务器端的界面由一个主窗口加三个控件组成,其中有两个edit 控件和一个button 控件。
程序设计窗口截图如下:指定好服务端口号,本程序指定为1111。
然后建立窗口函数所关心的SOCKET 通信消息,为程序为FD_ACCEPT 和FD_READ 。
在服务器端建立本地socket ,用bind 函数绑定本地套接字地址,最大连接数设置为5。
完成之后进行监听,看是否有客户端请求连接,若有则接受连接。
建立连接之后用,如果要发送数据,则在下面的sendEdit 里面输入想要发送的内容,然后点击“发送”按钮。
计算机网络技术第四版课程设计

计算机网络技术第四版课程设计一、设计题目本次计算机网络技术课程设计的题目是“基于TCP协议的文件传输程序实现”。
二、设计目的计算机网络技术是网络工程专业的核心基础课程之一,课程涉及到计算机网络领域的各个方向,例如网络协议、网络体系结构、路由协议、网络安全等。
通过本次课程设计,旨在让学生深入了解TCP协议的应用,掌握TCP协议的实现过程和技术要点,提高学生对计算机网络技术的理解和应用能力。
三、设计要求实现一个基于TCP协议的文件传输程序,要求如下:1.接收方和发送方分别处于不同的机器上。
2.文件传输过程通过TCP协议完成。
3.实现断点续传功能。
4.通过命令行界面输入传输文件的路径和传输模式(上传/下载)等必要信息。
四、设计流程1. 建立网络连接建立TCP连接是实现文件传输的第一步,需要使用Python的socket库实现。
按照TCP三次握手的规则,建立与对方的链接。
2. 传输文件使用Python的文件读取方式,将要传输的文件读取至内存中。
使用TCP协议,将文件分成多个数据块,依次传输至对方机器。
3. 断点续传在传输文件的过程中,可能会出现意外断开连接的情况。
为了实现断点续传功能,传输过程中需要保存已经传输的文件块,当重新建立连接后继续传输。
4. 命令行控制实现一个命令行界面,通过命令行输入文件传输的相关信息,例如待传输文件的路径、传输模式(上传/下载)等信息。
通过分析用户的操作,执行相应的文件传输操作,并在命令行上显示传输过程的相关信息。
五、技术要点1.Python Socket编程2.TCP协议3.文件读取和写入4.断点续传5.命令行控制六、设计结论通过本次基于TCP协议的文件传输程序实现的计算机网络技术课程设计,我们深入了解了TCP协议的应用过程,掌握了TCP协议的实现技术要点,并实现了文件传输过程中常见的断点续传功能和命令行控制。
这些技术点均是计算机网络技术课程中的重点内容,对我们深入学习和理解计算机网络技术的概念和应用具有重要的帮助和启示。
局域网文件传输实验报告

局域⽹⽂件传输实验报告局域⽹⽂件传输实验报告实验名称:编写局域⽹内进⾏⽂件传输的⼩⼯具实验⽬的:通过编写局域⽹内⽂件传输的⼯具,熟悉基于UDP的Socket编程,熟悉Winsock的相关内容。
对套接字编程有⼀定的理解和应⽤。
实验内容:本⼩组最终结果实现的实验内容:完成基本任务要求:输⼊对⽅IP 地址,对⽅如果存在,可以给对⽅发送⽂件。
完成扩展任务要求:1.⼯具具有图形交互界⾯;2.局域⽹内使⽤该⼯具的两台主机可以互相进⾏⽂字通信;3.⾃动按照⼀定频率扫描局域⽹内其他开启了该⼯具的主机,并在界⾯上⽤列表显⽰出来;4.传输⽂件和⽂字内容时,直接选择界⾯上已经显⽰出来的存活主机,不需要⼿动输⼊IP 地址。
实验准备说明:操作系统:Windows XP开发语⾔:C++,MFC开发平台:Microsoft Visual C++ 6.0由于开发图形界⾯时需要⽤到MFC,因此对缺乏MFC编译运⾏环境的VC6可能需要加载相应的动态链接库DLL⽂件。
加载⽅法:将DLL⽂件置放于系统链接库路径。
即:C:\WINDOWS\system32实验设计与开发:程序设计思路:程序所采⽤基于TCP/IP协议的Winsock编程原理,编程模型采⽤客户机/服务器(Client/Server)⽅式,为了⽅便使⽤,设计将客户机和服务器合⽽为⼀。
在通信的时候主要可以分为两个部分,⼀个部分是⽤于传送控制信息,例如发送⽂件的请求,⽂件的名称、⼤⼩等,由于这⽅⾯的数据量⽐较⼩,为了⽅便起见采⽤了MFC所提供的CSocket类的串⾏化技术来实现;⽽另⼀个部分就是⽂件的传输部分,对于⽂件的传输,由于数据量相对来说⽐较⼤,所以分别写了两个线程,⼀个⽤于发送,⼀个⽤于接收。
在添加附加功能聊天时,将聊天相关内容作为⼩⽂件传输,并将其显⽰在相应的控件中。
这两个部分在具体实现的时候分别建⽴有⾃⼰的套接字(Socket)。
程序代码内容⼤体分为图形界⾯和后台交互两个模块,在最开始设计开发时原本准备以此作为分⼯,但实际图形界⾯代码较少,⽽且主要的复杂点在于事件响应和句柄绑定,⽐较容易解决,总体⼯作量较少,因此图形界⾯后来是共同讨论开发,设计完成后根据具体的控件响应分⼯相关联的后台交互代码开发。
基于局域网的文件传输系统的设计与实现

基于局域网的文件传输系统的设计与实现摘要随着互联网技术的迅猛发展,计算机通信给人类文明带来了翻天覆地的变化。
很多情况下,人们的日常工作需要借助文件传输来完成。
但大多数文件传输功能都需要借助移动磁盘等硬件设备或Internet上的服务器才能实现。
这就给那些具有大规模内部网络的用户造成了许多问题,如浪费资金、浪费网络资源、病毒入侵、降低了工作效率等。
为了方便局域网内主机的资源共享,需要开发一个基于局域网的文件传输工具,在内部网络中实现文件交换。
基于局域网的文件传输系统的设计选用Delphi 为开发工具,以C/S模式通过建立Socket连接后实现局域网快速,准确,安全的点对点文件以及文件夹传输功能。
本系统能够促进局域网内用户之间的文件资源共享,满足主机之间信息交流,确保文件及文件夹传输安全性,有效地提高工作效率。
设计共分为五大模块,分别为:一、介绍选题背景及意义和国内外研究现状;二、介绍TCP/IP点对点协议技术,C/S架构的Delphi程序设计技术和Socket网络编程技术;三、对当前局域网文件传输进行需求分析并提出解决方案;四、根据解决方案对系统进行设计;五、对基于局域网的文件传输系统进行测试并得到测试结果。
关键词:C/S结构;网络通讯组件;点对点;Socket连接The Design and Implementation of File TransferSystem Based on LANAbstractAlong with the Internet technology swift and violent development, the computer correspondence the human culture has brought the earth-shaking change for. In very many situations, people's routine work needs to draw support from the file transfer to complete. But the majority file transfer function all needs to draw support moves hardware equipment or the Internet and so in the floppy disk server can realize This gave these to have the large-scale internal network user to create many problems, like the waste fund, the waste network resources, the viral invasion, reduced the working efficiency and so on. In order to facilitate in the local area network main engine resources sharing, needs to develop one based on the local area network file transfer tool, realizes the document exchange in internal network.The design and implementation of file transfer system base on LAN uses Delphi development tool,C/S mode through the establishment of Socket after connecting LAN users fast, accurate, the point-to-point security files and folders transmission functions. The system can contribute to LAN users to share file resources to meet the exchange of information between mainframe, ensure that the filets and folders transmission security, effectively improving efficiency.The design is divided into five major module altogether, including: First, introduction selected topic background and significance and domestic and foreign research present situation; Second, introduces the TCP/IP point to point protocol technology, C/S overhead construction Delphi programming technique and the Socket network programming technology; Third, carries on the demand to the current local area network file transfer to analyze and to propose the solution; Fourth, carries on the design according to the solution to the system; Fifth, to carries on based on the local area network file transfer system tests and obtains the test result.Key words:C/S structure; Network communication module; Point-to-point; Socket connection.目录论文总页数:26页1 引言 (1)1.1 选题背景 (1)1.2 国内外研究现状 (1)1.3 课题研究的意义 (1)2 理论基础 (2)2.1 TCP/IP点对点协议技术 (2)2.2 C/S架构的DELPHI程序设计技术 (2)2.3 SOCKET网络程序设计技术 (3)3 系统需求分析 (4)3.1 现行业务系统描述 (4)3.2 现行系统存在的主要问题分析 (4)3.3 提出解决方案 (4)4 系统设计 (5)4.1 系统总体架构 (5)4.2 系统界面设计 (6)4.2.1 界面设计 (6)4.2.2 用户信息 (7)4.3 系统功能模块设计 (9)4.3.1 获取用户信息 (9)4.3.2 局域网内文件传输 (13)4.3.3 局域网内文件夹传输 (17)5 系统实施及测试 (22)5.1 实施概况 (22)5.2 测试方案 (22)5.3 测试结果 (23)参考文献 (24)致谢 (25)声明 (26)1引言1.1选题背景当今世界科学技术飞速发展,尤其以计算机通信网络为代表的互联网技术更是日新月异,令人眼花燎乱,目不睱接。
vue3+elementplus 实现文件上传拿到后台返回的参数-详细说明

vue3+elementplus 实现文件上传拿到后台返回的参数1. 引言1.1 概述概述部分旨在向读者介绍本文的主题和重要背景信息。
本文将深入探讨如何利用Vue3和ElementPlus实现文件上传,并展示如何获取后台返回的参数。
通过阅读本文,读者将了解到如何搭建基于Vue3和ElementPlus的前端环境,并实现文件上传功能。
此外,本文还将详细介绍如何从后台获取上传文件的相关参数,并进行进一步处理。
文件上传在Web开发中非常常见且有着广泛的应用。
通过文件上传功能,用户可以将本地的文件发送到服务器端进行存储、处理或共享。
在本文中,我们将重点关注Vue3和ElementPlus这两个流行的前端框架,它们提供了丰富的工具和组件,使得实现文件上传变得方便且高效。
在接下来的章节中,我们将首先介绍Vue3和ElementPlus的基础知识,包括它们的特点和优势。
然后,我们将深入探讨文件上传的实现方法。
在前端实现部分,我们将介绍如何使用ElementPlus组件库中的上传组件构建一个用户友好的文件选择和上传界面。
接着,我们将重点关注后台返回参数的获取,解释如何从后台获取并处理上传文件的相关信息。
通过本文的学习,读者将能够全面了解Vue3和ElementPlus的使用方法,并学会实现文件上传功能并获取后台返回的参数。
本文将提供具体的代码示例和详细的步骤说明,帮助读者逐步完成文件上传功能的实现。
阅读本文后,读者将能够在自己的项目中灵活运用Vue3和ElementPlus,实现高效的文件上传功能,提升项目的用户体验和功能性能。
1.2 文章结构本文主要分为三个部分:引言、正文和结论。
引言部分将对本文涉及的主题进行概述,介绍Vue3和ElementPlus 的简要背景,并明确本文的目的。
正文部分将详细介绍Vue3和ElementPlus的相关知识,并重点讲解文件上传的实现过程。
其中,包括前端实现和后台返回参数的获取两个部分。
FTP客户端的设计与实现

FTP客户端的设计与实现1. 简介FTP(File Transfer Protocol)是一种用于文件传输的标准协议。
FTP客户端是指使用FTP协议与FTP服务器进行通信并传输文件的程序。
在本文中,我们将探讨FTP客户端的设计与实现。
2. 设计2.1 功能需求FTP客户端的主要功能需求包括:1.连接到FTP服务器2.在FTP服务器和本地电脑之间传输文件3.列出FTP服务器上的文件和目录4.创建和删除FTP服务器上的目录5.重命名FTP服务器上的文件6.支持多种操作系统(如Windows、Linux等)2.2 架构设计FTP客户端采用MVC(Model-View-Controller)模式来设计,其中:•Model层:管理FTP客户端的业务与数据逻辑。
提供FTP相关的API,封装了FTP协议的底层实现。
•View层:处理和呈现用户界面。
•Controller层:处理用户请求,调用Model层实现相关业务逻辑。
2.3 技术选型FTP客户端的技术选型如下:•编程语言:Java•GUI框架:JavaFX•FTP库:Apache Commons Net•构建工具:Maven•版本控制:Git2.4 待解决问题FTP客户端在设计中会遇到以下问题:1.如何扩展支持更多的FTP协议?2.如何实现可靠的文件传输?3.如何提高用户界面的体验?3. 实现3.1 界面实现使用JavaFX框架实现FTP客户端的用户界面。
主要界面包括:•登录界面:输入FTP服务器地址、用户名和密码登录FTP服务器。
•主界面:显示FTP服务器上的文件和目录,并提供文件传输和操作的操作界面。
3.2 功能实现FTP客户端通过Apache Commons Net库实现FTP底层协议。
实现的功能包括:1.连接到FTP服务器FTPClient ftp = new FTPClient();ftp.connect(server, port);ftp.login(username, password);2.在FTP服务器和本地电脑之间传输文件ftp.retrieveFile(remoteFile, localFile);ftp.storeFile(remoteFile, localFile);3.列出FTP服务器上的文件和目录FTPFile[] files = ftp.listFiles(remoteDir);4.创建和删除FTP服务器上的目录ftp.mkd(remoteDir);ftp.rmd(remoteDir);5.重命名FTP服务器上的文件ftp.rename(from, to);4. 总结通过对FTP客户端的设计与实现,我们了解了FTP协议的底层实现和FTP客户端的主要功能。
网络文件传输系统的设计与实现

网络文件传输系统的设计与实现作者指导老师摘要:在科学技术飞速发展的今天,Internet已经和人们的日常生活息息相关,无论是工作,学习还是娱乐,都离不开网络。
比如有时候需要进行文件的传输,虽然现在的许多网络文件传输工具能基本满足人们对文件传输质量的要求,但是它们往往都存在安全性,工作效率低等问题。
本课程设计的文件传输系统是在Windows操作系统下,Visual C + + 6.0环境下借用WinSock控件实现的,是基于TCP/IP协议的C/S模式,在服务器和客户端分别以socket为中心进行编程,客户端和服务器端的界面分别是由文件发送模块和文件接收模块组成。
客户端先调用connect()与服务器建立连接,然后用send()发送数据;服务器端先调用listen()侦听客户端的连接请求,然后调用accept()对连接请求进行响应,如果需要接收数据,则会调用receive()接收。
本文件传输系统成功的实现了服务器和客户端的文件传输,不论是较小范围内的局域网还是远程网,而且还可以传输多种格式的文件,如word,视频,图像等。
相比其它文件传输工具而言,本系统有很多的优点。
首先,界面简单,易于操作;其次,传输较大的文件时,不需要花费很长时间。
关键词:文件传输;WinSock ; socket编程; C/S结构目录1 绪论 (3)1.1选题背景 (3)1.2选题意义 (3)2开发环境及相关技术简介 (4)2.1开发环境Visual C++ 6.0介绍 (4)2.2基于vc的socket网络编程的基本原理 (4)2.2.1 socket的基本概念 (4)2.2.2Winsock网络编程原理 (5)2.3 TCP/IP协议简介 (5)2.5 C/S结构 (6)2.5.1 C/S结构的概念 (6)2.5.2 C/S结构的工作模式 (6)2.5.3 C/S结构的优点 (6)3 网络文件传输系统的设计 (6)3.1服务器端和客户端界面介绍 (7)3.1.1服务器界面介绍 (7)3.1.2客户端界面介绍 (7)3.2服务器端,客户端程序分析 (8)3.2.1服务器端分析 (8)3.2.2客户端分析 (12)4实现 (16)4.1系统运行环境 (16)4.2文件传输系统的测试 (16)4.2.1实验一:局域网内文件传输 (16)4.2.2实验二:远程网络上文件传输 (18)4.2.3实验三:较大文件的传输 (20)4.2.4实验四:不同格式文件的传输 (20)4.3该文件传输系统的不足 (21)5结论 (21)致谢 (22)参考文献 (23)1 绪论1.1选题背景21世纪被称为信息时代,因为计算机技术的迅猛发展,给人们的日常生活以及工作,都带来翻天覆地的变化。
文件传输C语言实现

////////////////////////////////////#include <netinet/in.h> // for sockaddr_in#include <sys/types.h> // for socket#include <sys/socket.h> // for socket#include <stdio.h> // for printf#include <stdlib.h> // for exit#include <string.h> // for bzero#include <time.h> //for time_t and time#define HELLO_WORLD_SERVER_PORT 7754#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024int main(int argc, char **argv){struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);// time_t now;FILE *stream;int server_socket = socket(AF_INET,SOCK_STREAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);}if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) {printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT); exit(1);}if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ){printf("Server Listen Failed!");}while (1)struct sockaddr_in client_addr;socklen_t length = sizeof(client_addr);int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length); if ( new_server_socket < 0){printf("Server Accept Failed!\n");break;}char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);strcpy(buffer,"Hello,World! ");strcat(buffer,"\n"); //send(new_server_socket,buffer,BUFFER_SIZE,0);bzero(buffer,BUFFER_SIZE);= recv(new_server_socket,buffer,BUFFER_SIZE,0);if (length < 0){printf("Server Recieve Data Failed!\n");exit(1);}printf("\n%s",buffer);if((stream = fopen("z.mp3","r"))==NULL){printf("The file 'data1' was not opened! \n");exit(1);}elseprintf("The file 'filename' was opened! \n");bzero(buffer,BUFFER_SIZE);int lengsize = 0;while((lengsize = fread(buffer,1,1024,stream)) > 0){printf("lengsize = %d\n",lengsize);if(send(new_server_socket,buffer,lengsize,0)<0){printf("Send File is Failed\n");break;}bzero(buffer, BUFFER_SIZE);}if(fclose(stream))printf("The file 'data' was not closed! \n");exit(1);close(new_server_socket);}close(server_socket);return 0;}//client.c////////////////////////////////////#include <netinet/in.h> // for sockaddr_in#include <sys/types.h> // for socket#include <sys/socket.h> // for socket#include <stdio.h> // for printf#include <stdlib.h> // for exit#include <string.h> // for bzero#include <time.h> //for time_t and time #include <arpa/inet.h>#define HELLO_WORLD_SERVER_PORT 7754#define BUFFER_SIZE 1024int main(int argc, char **argv){if (argc != 2){printf("Usage: ./%s ServerIPAddress\n",argv[0]);exit(1);}//time_t now;FILE *stream;struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr));client_addr.sin_family = AF_INET;client_addr.sin_addr.s_addr = htons(INADDR_ANY);client_addr.sin_port = htons(0);int client_socket = socket(AF_INET,SOCK_STREAM,0);if( client_socket < 0){printf("Create Socket Failed!\n");exit(1);}if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))){printf("Client Bind Port Failed!\n");exit(1);}struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_aton(argv[1],&server_addr.sin_addr) == 0){printf("Server IP Address Error!\n");exit(1);}server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0) {printf("Can Not Connect To %s!\n",argv[1]);exit(1);}char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);int length = recv(client_socket,buffer,BUFFER_SIZE,0);if(length < 0){printf("Recieve Data From Server %s Failed!\n", argv[1]); exit(1);}printf("\n%s\n",buffer);bzero(buffer,BUFFER_SIZE);bzero(buffer,BUFFER_SIZE);strcpy(buffer,"Hello, World! From Client\n");send(client_socket,buffer,BUFFER_SIZE,0);if((stream = fopen("data","w+t"))==NULL){printf("The file 'data' was not opened! \n");}elsebzero(buffer,BUFFER_SIZE);length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)) {if(length < 0){printf("Recieve Data From Server %s Failed!\n", argv[1]); break;}int write_length = fwrite(buffer,sizeof(char),length,stream); if (write_length<length){printf("File is Write Failed\n");break;}bzero(buffer,BUFFER_SIZE);}printf("Recieve File From Server[%s] Finished\n", argv[1]); fclose(stream);close(client_socket);return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Internet网络程序设计实验报告基于Socket的文件传输程序设计姓名:莫敌班级:软件 0904学号:U200917895指导老师:陆永忠2012.03.31目录1 实验目的及要求 (3)1.1 实验目的 (3)1.2 实验要求 (3)2 实验环境 (3)3 实验程序设计 (3)3.1 设计思想 (3)3.2 程序设计流程框图 (4)3.3 详细设计 (5)3.3.1 界面设计 (5)3.3.2 主要功能实现 (6)3.4 运行结果 (9)4 实验感想 (11)1实验目的及要求1.1实验目的熟悉Socket的通讯机制,了解网络程序的设计方法。
重点掌握基于TCP协议的Socket 网络编程。
1.2实验要求设计界面,在服务器端和客户端传输图片和文件。
如果是图片请显示该图片,如果是其他文件,则保存。
2实验环境编译环境:Windows 7 + Visual Studio 2010 使用MFC编写。
运行环境:Windows 7操作系统。
3实验程序设计3.1设计思想根据实验的要求:在服务器和客户端之间传输文件和图片,则需要程序提供一种可靠的网络传输服务来保证文件在传输过程中无丢失、损坏。
在分析了传输层协议TCP协议和UDP 协议后,了解到TCP协议提供的是一种面向连接的、可靠的字节流服务,而UDP协议提供的是一种无连接的、不可靠的数据报服务。
由于程序的需求,即必须保证文件传输的可靠性,于是,我采用基于TCP协议的Windows sockets来设计实现本实验。
3.2程序设计流程框图图1程序设计流程框图3.3详细设计基于TCP的socket编程流程:服务器端:创建套接字(socket)。
将套接字绑定到一个本地地址和端口上(bind)。
将套接字设为监听模式,准备接收客户端请求(listen)。
等待客户端请求到来。
当请求到来后,接收连接请求,返回一个新的对应于此次连接的套件字(accept)。
用返回的套接字和客户端进行通信(send/recv)。
返回,等待另一客户端请求。
关闭套接字。
客户端:创建套接字(socket)。
向服务器发出连接请求(connect)。
和服务器端进行通信(send/recv)。
关闭套接字。
3.3.1界面设计图2程序界面由于程序实现的功能单一简单,所以我的程序界面设计如图2所示。
程序由两个用户可操作的控件组成:IP地址控件,用户输入将要接收文件的接收方IP 地址;“发送文件”按钮,单击选择用户要发送的文件并发送所选文件数据。
3.3.2主要功能实现套接字库加载:AfxSocketInit()接收线程:UINT RecvProc( LPVOID pParam ){while (TRUE){CSocket tmpSock;CSocket servSock;tmpSock.Create(5000);tmpSock.Listen(1);tmpSock.Accept(servSock);char fileNameRecv[500] = {0};int a = servSock.Receive(fileNameRecv, 500);CFileDialog saveDlg(FALSE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文件(*.*)|*.*||");saveDlg.m_ofn.lpstrFile = fileNameRecv;if (IDOK == saveDlg.DoModal()){CFile recvFile;CString recvPathName;recvPathName = saveDlg.GetPathName();recvFile.Open(recvPathName, CFile::modeCreate | CFile::modeWrite);UINT uiLength;servSock.Receive(&uiLength, 4);int iBufSize = 1024 * 5;int iSize = iBufSize;LPBYTE pBuf = new BYTE[iBufSize];int iNumByte;UINT uiTotal = 0;while (uiTotal < uiLength){if ((int)(uiLength - uiTotal) < iBufSize){iSize = uiLength - uiTotal;}int iCount = 0;while (iCount < iSize){iNumByte = servSock.Receive(pBuf, iSize - iCount);iCount += iNumByte;recvFile.Write(pBuf, iNumByte);}uiTotal += iCount;}recvFile.Close();servSock.Close();char ext[10];CString tmpExt;_splitpath(recvPathName, NULL, NULL, NULL, ext);tmpExt = ext;if(".bmp"== tmpExt || ".pcx"== tmpExt || ".tiff"== tmpExt || ".gif"== tmpExt || ".jpg" == tmpExt || ".jpeg" == tmpExt || ".tga" == tmpExt || ".exif" == tmpExt || ".fpx" == tmpExt){ShellExecute(NULL, "open", recvPathName, NULL, NULL, SW_SHOWNORMAL);}}}return 0;}发送文件按钮:void CmyFileTransferDlg::OnBnClickedBtnSend(){CFileDialog openDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "所有文件(*.*)|*.*||");if (IDOK == openDlg.DoModal()){CString openFileName;openFileName = openDlg.GetFileName();CSocket sendSock;sendSock.Create();CString IPstr;this->GetDlgItem(IDC_IPADDRESS1)->GetWindowText(IPstr);if (sendSock.Connect(IPstr, 5000) == 0){return;}CFile sendFile;sendFile.Open(openDlg.GetPathName(), CFile::modeRead);sendSock.Send(openFileName, 500);UINT uiLength;uiLength = sendFile.GetLength();sendSock.Send(&uiLength, 4);int iBufSize = 1024 * 5;int iSize = iBufSize;LPBYTE pBuf = new BYTE[iBufSize];int iNumByte;UINT uiTotal = 0;while (uiTotal < uiLength){if ((int)(uiLength - uiTotal) < iBufSize){iSize = uiLength - uiTotal;}iSize = sendFile.Read(pBuf, iSize);int iCount = 0;while (iCount < iSize){iNumByte = sendSock.Send(pBuf, iSize - iCount);iCount += iNumByte;if (iCount < iSize){sendFile.Seek(iSize - iCount, CFile::current);}}uiTotal += iCount;}sendFile.Close();sendSock.Close();}3.4运行结果说明:为了便于测试和观察,选择127.0.0.1的发送IP地址进行单机测试。
图3程序运行启动界面双击打开myFileTransfer.exe可执行程序后的程序启动界面如图3所示,然后在“对方IP 地址”栏中输入本地回送地址127.0.0.1准备进行发送文件。
图4发送文件选择界面单击“发送文件”按钮后,弹出如图4所示的文件选择界面,选择要发送的文件并单击“打开”按键,确定选择并将所选文件发送给接收方。
图5接受方接收到文件当接收方接收到发送方传来的文件时,接收方程序弹出如图5所示的“保存”界面,提示用户接收文件成功并进行保存。
图6接收图片自动显示当接收方接收的文件为图片时,程序调用操作系统默认的图片浏览器自动打开浏览接收到的图片。
当接收的是非图片文件时,程序则只是保存该文件,而不自动打开。
4实验感想通过独立完成了这次实验的全部内容,我对网络编程有了更全面、深刻地认识和了解,尤其是对Windows socket的掌握和编程应用。
由于我对MFC较为熟悉,所以在整个实验过程中,我采用MFC进行编程来实现这个传输文件的程序。
在程序实现之前,我通过网络上的基于socket网络编程资料和老师课上讲解的内容,认真全面地学习了Windows socket的运行机制和其在网络编程上的应用方法。
在设计实现阶段,我最先使用的是基础SOCKET类,但在通信双方传送文件的基本信息的具体实现时,遇到了不少的麻烦。
比如SOCKET类中的send方法的第二个参数类型是“const char *”用来指明一个存放将要发送数据的缓冲区,但在传文件信息长度int类型等非char *的变量时转化很麻烦。
于是,我查看MSDN文档了解到MFC已为开发者封装了一个很简便的CSOCKET类。
应用CSOCKET类能很方便容易地解决上面的问题,而且实现网络通信的流程也很清晰,最终我采用MFC封装的CSOCKET类编码实现的这次实验内容。
在接收图片自动显示的问题上,我试验了两种实现方式:用一个MFC中的承托图片控件来显示和调用操作系统默认的图片浏览程序来显示,对比操作效果和用户使用习惯,后者的解决方案更好,所以最终我采用调用操作系统默认的图片浏览程序来对图片文件进行自动打开显示。