您当前的位置: 首页 > 

项目实战:基于 TCP 的局域网内高性能文件传输系统设计与实现

蔚1 发布时间:2019-05-29 23:30:07 ,浏览量:2

本项目开发基于 Red Hat Enterprise Linux(RHEL) 6.3 平台 ,通过本项目大家会深入理解下述内容:

  1. Socket 网络编程技术
  2. 基于TCP/IP 协议的网络编程技术
  3. 基于 TCP 的高并发 C/S 设计
  4. IO 复用技术
  5. MySQL API 编程技术
  6. Shell 脚本编程技术

本项目使用 C 语言作为主要开发语言,Shell作为辅助开发语言,如果你想深入学习 Linux C 网络编程技术,那就快来加入吧!!!

      • 0. 写在前面
      • 1. 系统设计目标
      • 2. 系统整体设计思路
        • 2.1 网络传输协议的选择与通信协议的设计
        • 2.2 数据库设计
      • 3. 上传、下载文件的设计方案
      • 4. 断点续传的原理及设计
      • 5. 秒传的原理及设计
      • 6. 数据库设计 API 编程与 shell 脚本的结合
      • 7. 大文件的传输
      • 8. sendfile() “零拷贝”技术
      • 9. 实现高并发——负载均衡技术
      • 10. 系统演示
      • GitHub 源码地址
      • 后记
0. 写在前面

这是我的第一篇 Chat 分享,之前都是在 我的CSDN博客:ZYZMZM 上更新 C/C++/Linux 等基础知识和一些底层实现原理之类的博文,想尝试一种新的方式,并且自己开发本项目也比较用心,本项目由我一个人独立开发,真诚地想和大家分享一下自己的感悟、项目的整题设计流程和遇到的各种坑,没有想到发布两天时间就有 120 多位朋友的预定,在这里再次感谢大家的支持。

完成本项目的预备知识我在文件的后记部分给大家分享了我 CSDN 博文的链接。

本场 Chat 主要围绕下述内容展开介绍:

enter image description here

文章最后给出项目的 GitHub 源码地址,供大家分享。

1. 系统设计目标

系统基于 TCP 协议提供局域网 LAN 内文件传输(含大文件传输)服务,首先要有基本的命令交互功能,比如客户端要查看服务端文件信息、root 管理员用户可以删除服务端文件信息等基本命令交互,核心是实现文件的上传和下载功能。

这些功能本身是非常容易实现的,是基本的 TCP 协议通信传输过程。再从功能上进行丰富,需要实现文件传输过程中的断点续传功能、秒传功能。进一步丰富功能,应该实现简单的用户管理功能:新用户可以通过注册进入系统,已注册的用户可以直接登录进入系统,而且系统中应该有一个管理员用户拥有更高级别的权限,比如删除服务端文件、关闭服务器等。

因为添加了用户管理模块,因此需要在文件的上传和下载部分做一些改变进行正确的控制,之后会详述。

更为重要的是需要实现多客户对服务器的并发访问,在这里我们简单地使用多线程来实现。因为服务器提供局域网 LAN 内文件传输,因此多线程实现是基本满足要求的。那么在大型复杂的环境中,我们应该使用分布式集群技术,可以采用负载均衡技术实现分布式集群的高并发问题,我们在文章最后会讨论其原理。

2. 系统整体设计思路 2.1 网络传输协议的选择与通信协议的设计

那么首先,先忽视一些细枝末节,我们分析系统应该如何实现文件上传和下载主要功能。

由于是进行文件传输,因此我们需要使用面向连接的、可靠的 TCP 协议来作为系统的网络传输协议。我们使用 Socket 编程,虽然难度较高,但对于理解协议的执行过程是很有效的学习方式,使用两个重要的接口 send() 和 recv() 函数来实现数据的收发功能。我们也自定义通信协议进行客户端与服务器的通信过程,例如,下载文件时,客户端向服务器发送“begin”,服务器收到后便开始向客户端传输文件,服务器传输完毕后向客户端发送“##close##”,客户端收到后便停止数据接收,文件传输完毕。

那么在这里我们需要考虑一个问题,当服务器与客户端进行文件传输的时候,文件未传输完毕,客户端因为各种原因退出了,那么服务器便会崩溃,导致了不稳定性的产生。根本原因是服务器会接收到一个 SIGPIPE 信号,我们可以使用三种方式来解决。

  1. 在服务器端忽略 SIGPIPE 信号
  2. 使用 send() 函数的 MSG_NOSIGNAL 标志位
  3. 使用 poll() 函数监测 POLLRDHUP 事件,捕获连接异常
2.2 数据库设计

本系统为了服务器的高可用和稳定性,使用了第三种方式来解决客端异常断开连接的情况。我们在后面会进行讲解具体实现。

上面解决了系统的基本问题:上传和下载。接下来我们谈一下系统的用户管理设计、文件管理设计。

我们采用 MySQL 作为服务器的后台数据库,建立了三个数据库:

loginUser

用户信息数据库。数据表为 user,主要存储用户名和密码,用于登录验证的匹配。

enter image description here

md5

文件信息数据库。数据表为 md5table,主要存储文件的主要信息:文件名、文件 MD5 值、文件属主、文件完整标志位。

enter image description here

serverLog

服务器启动信息数据库。数据表为 serverStartInfo,主要记录服务器启动次数、启动时间。

关注
打赏
1688896170
查看更多评论

蔚1

暂无认证

  • 2浏览

    0关注

    4645博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0565s