写一个简单的FTP 文件传送

进行之前需要几个简单的知识点。

1. Socket的简单了解

2. 二进制的简单了解

 

有了以上两点,就可以开始了。

 

首先网络传输数据的基本原理,就是套接字,CS:

C指的是Client(客户端),S指的是Server(服务器)。

一个服务器对多个客户端的通讯模型,那服务器怎么区分哪个是哪个客户端发来的消息呢?     

服务器区分客户端的三大要素:1.IP地址,2.端口,3.通讯类型(TCP,UDP)   

比如:127.0.0.1:56631(TCP)                   

这就是一个地址,返回数据只要往该地址端口发送数据就可以了(当然前提是已经建立了三次握手的链接)。

 

 

Java中储存IP,端口的类,是Socket。

不过与其说他是储存的,不如说它是一个集成的套接字,里边带输入输出流以及、各种常用的功能十分方便。   

而C++中 则是通过Addr储存客户端的信息,多个客户端就通过stl容器储存,发送数据则是send函数,接受数据则是recv函数。并不像Java一样已经把Socket集成了。

 

先整理一下思路:

1.先建立ServerSocket ,监听一个端口,等待客户端链接。

2.拿到客户端的Socket,获取客户端发送的数据,当然也可以验证账号密码、

3.判断客户端指令,如{list,pwd,get,put}

4.返回相应的数据

 

当然,既然是ftp,那最重要的就是传输文件。

我的设想是这样的,客户端发送 get index.php  

服务器接收到指令,从文件中读取index.php 计算文件大小,返回相应的字节长度格式如下          {length=1940,name=index.php}

客户端接收到信息后,在文件中创建一个文件 index.php 并把字节长度储存在long temp中。

客户端

long temp = 1920;        //从服务器获取到的文件长度

byte buff[] = new byte[1024];

InputStream in = socket.getInputSteeam();

FileOutputStream out = new FileOutputStream(new File("index.php"));

//告诉服务器我已经准备好了,你可以发送了。
socket.getOutputStream.write("Start".getBytes(StandardCharsets.UTF_8));
socket.getOutputStream.flush();

//根据服务器给出的字节长度,计算出需要接受多少次的数据,不浪费资源。
for(int i=0;i<(temp/1024)+1;i++){
    int len = in.read(buff);
    out.write(buff,0,len);        //将从服务器接收到的数据直接写到储存的文件位置
}

//告诉服务器我已经接受完毕了
socket.getOutputStream.write("Exit".getBytes(StandardCharsets.UTF_8));
socket.getOutputStream.flush();



/*----------------------------------------------------------------------------------*/
服务器


File file = new File(name);

long length = file.length();    //计算文件长度

OutputStream out = socket.getOutputStream();

//返回文件长度,及文件名
out.write(("{length:"+length+",name:"+name+"}").getBytes(StandardCharsets.UTF_8));
out.flush();

FileInputStream in = new FileInputStream(file);

byte buff[] = new byte[1024];

//循环发送读取的字节,直到发送完毕
for(int i=0;i<(length/1024)+1;i++){
    int len = in.read(buff);
    out.write(buff,0,len);
}

以上就是简单的示例,具体的需要,可以按需增加。

如list 返回{{name:index.php,length:1920},{name:jQuery.js,length:2049}}

解析的格式是

name = index.php    length = 1920

name = jQuery.js      length = 2049

然后在把他显示在控制台就可以了。

 

最后祝愿大家更上一层楼。

 

个人粗略见解,希望可以帮到忙

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值