网络编程---实现简单的文件上传和下载

这里我是创建3个Java类:
Client(客户端)
Server(服务端)
DataUtil(工具类)

介绍:对d盘根目录下一个文件进行上传并下载到d:\ud文件夹中

步骤一:Server(服务端)

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class Server {
    public static void main(String[] args) throws Exception {
        //创建一个服务端,端口号为9999
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("文件服务器开启------");
        //获得一个客户端的连接
        Socket socket = serverSocket.accept();
        //文件的命名规则:域名+毫秒值+随机数,后面在加上文件的类型
        String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
        //Server端获取文件,实现的内容在工具类里面写,这里直接调用方法
        //如果不用随机命名的方法,而是指定命名,如生成一个名字为2.jpg的文件,就用下面方法
        //DataUtil.RecevieFile(socket,"2.jpg");
        DataUtil.RecevieFile(socket,fileName);
        }
        }

步骤二:Client(客户端)

import java.net.Socket;

public class Client {
    public static void main(String[] args) throws Exception {
        //客户端
        Socket socket = new Socket("127.0.0.1",9999);
        //被操作的原文件为d盘根目录下的1.jpg
        DataUtil.SendFile(socket,"d:\\1.jpg");
           }
}

步骤三:DataUtil(工具类) 用于实现客户端以及服务端的功能,对输入流,输出流进行操作

import java.io.*;
import java.net.Socket;

public class DataUtil {

//该方法用于服务端,服务端接收到客户端的请求accept后,调用该方法回应客户端生成一个文件
   public static void RecevieFile(Socket socket,String filename){
   //生成输出一个文件,使用fos流,这里需要用is流获取数据,获取数据后才能输出一个文件
       try {
       //使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
           InputStream is = socket.getInputStream();
           //判断d:\\ud文件夹是否存在,不存在则创建
           File file = new File("d:\\ud");
           if(!file.exists())
               file.mkdirs();
           //创建输出一个文件,构造方法中绑定要输出的目的地
           FileOutputStream fos = new FileOutputStream(file+"\\"+filename);


           int len = 0;
           byte []arr = new byte[1024];
            // 判断是否为最后一个字节,是的话结束循环
           while ((len=is.read(arr))!=-1){
               //使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
               fos.write(arr,0,len);
               
           }
           //使用网络字节输出流OutputStream对象中的方法write,给客户端回写"上传成功"
           socket.getOutputStream().write("上传成功".getBytes());

           //关流
           fos.close();
           socket.close();
           //is.close();
       } catch (IOException e) {
           e.printStackTrace();
       }

//用于客户端,客户端发送一个请求,上传源文件
   }
   public static void SendFile(Socket socket,String filename){
       try {
           //用fis流读取源文件,并对读取的数据用os流进行输出到服务器
           FileInputStream fis = new FileInputStream(filename);
           OutputStream os = socket.getOutputStream();
           int len =0;
           byte arr[] = new byte[1024];
           while ((len=fis.read(arr))!=-1){
               os.write(arr,0,len);
               //把读取到的内容上传到服务器
           }
           //上传完文件,给服务器写一个结束标记
           socket.shutdownOutput();
           //读取回写的内容,相应之前的"上传成功"
           InputStream is = socket.getInputStream();
           while ((len=is.read(arr))!=-1)
               System.out.println(new String(arr,0,len));

           //关流
           //while里面条件是到-1,但实际是没有-1,不关流就会一直等待,可能会报错
           fis.close();
           socket.close();
        //os.close();

       } catch (IOException e) {
           e.printStackTrace();
       }
   }

}

运行的时候,先运行Server端,再运行Client端。

因为这里没有用到多线程,所以传输文件只能一个,超过一个的话会报错。如果要传输多个的话,可以在服务端对accept方法进行while循环,再使用多线程的方法。

参考博客:实现文件上传和下载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值