C/S架构的简单文件传输系统的实现

源码:https://github.com/Lee-johnH/my_study.git

先上截图:

首先我有个Faded.mp3的文件在目录/mnt下,现在我要把它通过服务器传给客户端,传到客户端所在的文件目录下,并命名为new_Faded.mp3.

先执行服务器,并输入端口号,然后让客户端通过端口号向服务器发送连接请求,连接成功,服务器询问应将哪个文件传给客户端,输入原文件名,再输入新文件名,文件传输过去,传输完毕则提示传输成功。客户端用ls查看文件是否传输过来,目录下多了个new_Fade.mp3,并确认可以使用该文件,传输成功!

实现思路:

  服务器端:socket-->bind-->listen-->accept

  客户端: socket-->connect

  服务器建立套接字为网络通讯做基本准备,bind将本地的端口同socket返回的文件描述符捆绑在一起,listen函数将bind的文件描述符变为监听套接字,然后调用accept函数进入阻塞状态,直到客户端程序发出连接请求,便建立全双工通信。

  建立连接之后,先在服务器输入要传输的文件名,并保存在file_name[]数组当中,然后再输入新的文件名存入file_name_save[]中,将新的文件名通过send()函数发送给客户端,客户端通过recv()函数接收,并以此名打开文件进行写操作。

  在传送文件时我选择使用一个零拷贝函数sendfile(),好处是在传输文件时无需进入用户态,而是在内核态和磁盘直接就将文件传输过去,一来减少内核分配buffer的时间及空间,二来电脑无需从内核态切换到用户态,再从用户态切换到内核态,从而大大减少时间。保证在传输大文件时速度也很快,云盘的秒传技术用到了这个函数。

  最后,文件传输完毕服务器提示传输成功,客户端提示接收成功,并检验传输过来的文件是否可用。

时间: 2024-08-09 10:34:30

C/S架构的简单文件传输系统的实现的相关文章

Spring 架构的简单模拟实现

Spring 架构主要有两大特点: IOC /DI: 控制反转/依赖注入 AOP  切面编程 . 今天主要是实现IOC这一特点. 主要的逻辑如下: User 用户类. UserDAO  User类的访问接口. UserDAOImpl  实现UserDAO 接口以实现拓展. UserService  包含一系列的用户功能 ,如addUser 关于以上类的代码: package com.bjsxt.model; public class User { private String username;

android 简单文件操作

1.布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orient

安全文件传输系统

安全文件传输系统组成: 客户端:用户登录,上传文件,下载文件,浏览文件列表 服务器:用户登录,服务器配置,多线程管理,上传下载管理,系统日志 协议:自定义传输协议 要求: 1.系统要求必须支持将每个文件数据进行存储 2.客户端支持从服务器中获取文件的元数据 3.服务端要求是必须多线程的,能够允许多个客户同时连接 4.服务端必须记录文件操作事件日志,能够支持用户名和密码验证 5.客户端具有上传和下载能力,并且要求先检查磁盘空间 详细深入了解见SDK-SFSS/doc openssl编程.pdf o

LAMP架构的简单实现

web服务器的实现,在LAMP架构下,分为三层: 1.web服务器响应客户端请求的接入层 2.使用应用业务的应用层 3.后端提供数据服务的数据层 这三层已经能够满足基本需要了. 这三层分别使用http2.2.hph5.3和mysql5.1来实现. # yum install httpd # vim /etc/httpd/conf/httpd.conf ServerName 192.168.1.33:80 # service httpd configtest Syntax OK # vim /va

多进程和多线程的架构的简单介绍

多进程和多线程的架构的简单介绍 多线程的意义为帮助你决定开发软件时采用多进程架构还是多线程架构.不了解这种区别会在大型软件的设计开发过程中造成困扰. Oracle的Unix/Linux版本采用多进程架构,不同的功能模块由不同的进程负责,Windows版本采用单进程多线程架构,所有的模块所在线程处在同一个进程当中.我们来看一下区别:1.进程管理.Oracle某个模块挂起了,没有响应,万般无奈你要重起这个模块,Unix平台只要重起这个模块所在的那个进程就可以了,其它进程保持运行,而Windows平台

Java简单文件读写

Java简单文件读写, 昨天帮同学写了一个简单的文件处理程序,记录这边吧,竟然花了一个小时,就是因为system.out打印日志的时候位置写错了 :-( public static void main(String[] args){ try{ BufferedReader br = new BufferedReader(new FileReader("D:/a.txt")); File dest = new File("D:/b.txt"); BufferedWri

Android简单文件浏览器源代码 (转)

Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height=&qu

基于TCP的TFTP(Trivial File Transfer Protocol,简单文件传输协议) 的c编程实现

我们或许都听到过,TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务. 本文就简单的叙述下tftp的小文件传输功能以及客户端对服务器的列表功能. 之前就一直很纳闷,我们经常在网上下载什么东西或者从别处传输一个文件,具体是怎么实现的呢?于是乎,翻查一些资料,加上自己对网络编程的逐步加深,所以功夫不负有心人,还算是大致的完成了下. 本例程实现的功能呢?

tftp简单文件传输协议搭建

TFTP 简单文件传输协议 安装 sudo apt-get install tftp  tftpd openbsd-inetd 需要tftp tftpd openbsd-inetd  3个应用组件 配置 在/etc/inetd.conf tftp        dgram    udp    wait    nobody    /usr/sbin/tcpd    /usr/sbin/in.tftpd /home/gec/tftp 其中/home/gec/tftp就是tftp通信目录 建立目录 和