java socket 传多个文件下载,Socket编程多文件传输

有子曰:“其为人也孝弟,而好犯上者,鲜矣;不好犯上,而好作乱者,未之有也。君子务本,本立而道生。孝弟也者,其为仁之本与!”

项目介绍:基于TCP协议实现多文件传输

将F盘test文件加下的所有文件发送到D盘下的FTP文件夹里

368df4d2c5bd

思路:socket发送单个文件,然后通过for循环来实现多文件传输。

简单做法(这里就简单说下思路,没实现):

_1) socket与服务器建立连接

_2) 然后发送一个文件

_3) socket断开

_4) 循环第一步

以上做法非常简单,但是socket建立连接时非常耗费资源的,如果有1000个文件要同时上传,那么socket就要与服务器建立1000次连接和1000次断开连接。写到这里我突然想到连接池,连接池也是一种提高的方法,虽然没有频繁的创建销毁,但是初始化的时候就占用了系统的资源,我何不创建一个socket用到系统报废呢。

高端做法:

所以如果你还不知道IO流的概念,那你就不能算是一个合格的程序员

我这里简单的说一下,大神绕道

当客户端想服务端发送数据的时候,是以byte[]的形式传输的,byte[]数组存放的是ASCII码

比如第一次发送的是"ABC",然后紧接着又发送"abcd"

那么服务端接受接受到的就是"ABCabcd"

所以流是不会断开的,既然是连在一起的,那么怎么区分呢?

那就要同时向服务端传一个长度

比如第一次发送的是"ABC",那么在发送"ABC"之前要让服务器知道我发送的内容长度,这里发送一个int类型的3

同理发送"abcd"之前也要发一个int类型的4,这是长度让,让服务器截取内容用的。

然后服务器解析的时候先获取前4个字节解析长度,然后通过长度来获取内容

368df4d2c5bd

_1) socket与服务器建立连接

_2) 然后for循环发送多个文件

_3) socket断开

从建立连接到发送完毕断开连接,从始至终都是只有一个socket。

先画一个流程图。(好丑啊)

368df4d2c5bd

OK不废话了,开始上代码

1.启动服务,等待客户端连接

import java.io.BufferedInputStream;

import java.io.ByteArrayInputStream;

import java.io.DataInputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MoveAction;

public class TcpSendFileServer {

@SuppressWarnings("resource")

public static void main(String[] args) {

int port = 5555;

ServerSocket server =

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值