Day25文件上传案例

学习目标

1:文件上传案例
2:模拟B/S服务器

学习内容

一:文件上传案例

[客户端]输入流,从硬盘读取文件数据到程序中。
[客户端] 输出流,写出文件数据到服务端。
[服务端]输入流,读取文件数据到服务端程序。
[服务端]输出流,写出文件数据到服务器硬盘中。
在这里插入图片描述

实现步骤:
1、创建一个本地字节收入流FileInputStream 对象,构造方法中绑定读取数据的数据源。
2、创建一个socket 对象,构造方法中绑定服务器的IP地址和端口号。
3、使用socket中的方法getoutputstream 获取网络字节输出流。
4、使用本地字节输入流中的read方法,把读取的文件上传到服务器。
5、使用网络输出流中的write方法,读取本地文件。
6、使用socket 中方法,获取输入流对象
7、通过网络输入流对象中的read 方法,读取回写数据
8、释放资源
例如:
服务器

package Demo01FileUpload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        //1、创建一个服务器的serversocket 对象
        ServerSocket server = new ServerSocket(2221);

        //2、等待客户端连接
        Socket socket = server.accept();

        //3、获取输入流
        InputStream is = socket.getInputStream();

        //4、
        File file = new File("E:\\0601");
        if(!file.exists()){
            file.mkdirs();
        }
        FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");

        int len = 0;
        byte[] bytes = new byte[1024];
        while((len = is.read(bytes)) != -1){
            fos.write(bytes, 0, len);
        }

        socket.getOutputStream().write("图片上传成功".getBytes());

        fos.close();
        socket.close();
        server.close();
    }
}

客户端

package Demo01FileUpload;
/**
 * 实现步骤
 * 创建一个本地字节输入流FileInputStream对象,构造方法中绑定读取的数据源
 * 2创建一个socket对象,构造方法中绑定 服务器的IP地址和端口号
 * 3使用过socket中的方法,获取网络字节输出流
 * 4使用本地字节输入流中的read方法,获取本地文件
 * 5使用网络输出流中的write方法,把读取到的文件上传到服务器
 * 6使用socket中的方法,获取输入流对象
 * 7通过网络输入流对象中的热爱的反复,读取回写数据**/
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
实现步骤:
1、创建一个本地字节输入流 fileinputSteam 对象,构造方法中绑定读取的数据源
2、创建一个socket对象,构造方法中绑定服务器的IP地址和端口号
3、使用socket中的方法 getoutputstream 获取网络字节输出流
4、使用本地字节输入流中的read方法,读取本地文件
5、使用网络输出流write方法,把读取到的文件上传到服务器
6、使用socket中方法,获取输入流对象
7、通过网络输入流对象中的read方法,读取回写数据
8、释放资源
 */
public class TcpClient {
    public static void main(String[] args)  throws IOException {
        //1、创建一个本地字节输入流 fileinputSteam 对象,构造方法中绑定读取的数据源
        FileInputStream fis = new FileInputStream("C:\\Users\\admin\\Pictures\\Saved Pictures\\1.jpg");
        //2、创建一个socket对象,构造方法中绑定服务器的IP地址和端口号
        Socket socket = new Socket("127.0.0.1",2221);
//        3、使用socket中的方法 getoutputstream 获取网络字节输出流
        OutputStream os = socket.getOutputStream();

        int len = 0;
        byte[] bytes = new byte[1002];
        //4、使用本地字节输入流中的read方法,读取本地文件
        //5、使用网络输出流write方法,把读取到的文件上传到服务器
        while ((len = fis.read(bytes)) != -1) {
            os.write(bytes,0,len);
        }

        //告诉服务器,文件已经发送完毕
        socket.shutdownOutput();
        //获取网络输入流
        InputStream is = socket.getInputStream();
//        7、通过网络输入流对象中的read方法,读取回写数据
        while ((len = is.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len));
        }
        //释放资源
        fis.close();
        socket.close();
    }

}

结果为:
在这里插入图片描述
在这里插入图片描述
文件上传优化
(1)自定义一个文件的命名规则
(2)让服务器一直处于监听状态(死循环accept方法)
(3) 使用多线程技术,提高程序的效率
(4)重写run方法
优化实现
例如:

package Demo02FileUpload;

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.Random;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        //1、创建一个服务器的serversocket 对象
        ServerSocket server = new ServerSocket(8880);

        while (true) {
            //2、等待客户端连接
            Socket socket = server.accept();

            new Thread(new Runnable() {
                public void run() {
                    try {
                        //3、获取输入流
                        InputStream is = socket.getInputStream();

                        File file = new File("E:\\0601");
                        if (!file.exists()) {
                            file.mkdirs();
                        }

                        String fileName = "classFive" + System.currentTimeMillis() + new Random().nextInt(99999) + ".jpg";
                        FileOutputStream fos = new FileOutputStream(file + "\\" + fileName);

                        int len = 0;
                        byte[] bytes = new byte[1024];
                        while ((len = is.read(bytes)) != -1) {
                            fos.write(bytes, 0, len);
                        }

                        socket.getOutputStream().write("图片上传成功".getBytes());

                        fos.close();
                        socket.close();
                    } catch (IOException e) {
                        System.out.println(e);
                    }
                }
            }).start();
        }
    }
}
package Demo02FileUpload;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
实现步骤:
1、创建一个本地字节输入流 fileinputSteam 对象,构造方法中绑定读取的数据源
2、创建一个socket对象,构造方法中绑定服务器的IP地址和端口号
3、使用socket中的方法 getoutputstream 获取网络字节输出流
4、使用本地字节输入流中的read方法,读取本地文件
5、使用网络输出流write方法,把读取到的文件上传到服务器
6、使用socket中方法,获取输入流对象
7、通过网络输入流对象中的read方法,读取回写数据
8、释放资源
 */
public class TcpClient {
    public static void main(String[] args)  throws IOException {
        //1、创建一个本地字节输入流 fileinputSteam 对象,构造方法中绑定读取的数据源
        FileInputStream fis = new FileInputStream("C:\\Users\\admin\\Pictures\\Saved Pictures\\1.jpg");
        //2、创建一个socket对象,构造方法中绑定服务器的IP地址和端口号
        Socket socket = new Socket("127.0.0.1",8880);
//        3、使用socket中的方法 getoutputstream 获取网络字节输出流
        OutputStream os = socket.getOutputStream();

        int len = 0;
        byte[] bytes = new byte[1002];
        //4、使用本地字节输入流中的read方法,读取本地文件
        //5、使用网络输出流write方法,把读取到的文件上传到服务器
        while ((len = fis.read(bytes)) != -1) {
            os.write(bytes,0,len);
        }

        //告诉服务器,文件已经发送完毕
        socket.shutdownOutput();
        //获取网络输入流
        InputStream is = socket.getInputStream();
//        7、通过网络输入流对象中的read方法,读取回写数据
        while ((len = is.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len));
        }
        //释放资源
        fis.close();
        socket.close();
    }

}

结果为:
在这里插入图片描述
在这里插入图片描述

二:模拟B/S服务器

案例分析
在这里插入图片描述
准备网页数据,web文件夹
模拟服务端,ServerSocket 类监听窗口,使用浏览器访问
例如:

package Demo03BS;

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

public class TcpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8865);
        Socket socket = server.accept();
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0 ;
//        while ((len = is.read(bytes)) != -10){
//            System.out.println(new String(bytes,0,len));
//        }
        BufferedReader br =new BufferedReader(new InputStreamReader(is));
        //    GET / web HTTP/1.1

        String line =br.readLine();
        String[] arr = line.split(" ");
        String htmlpath = arr[1];
        FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+htmlpath);
        OutputStream os= socket .getOutputStream();

        os.write("HTTP/1.1 200 OK\r\n".getBytes());
        os.write("Content-Type:text/html\r\n".getBytes());
        os.write("\r\n".getBytes());

        while ((len = fis.read(bytes)) != -1){
            os.write(bytes,0,len);
        }
        fis.close();
        socket.close();
        server.close();
    }
}

package Demo03BS;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerThread {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8898);

        while (true) {
            Socket socket = server.accept();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        InputStream is = socket.getInputStream();
                        byte[] bytes = new byte[1024];
                        int len = 0;
//        while ((len = is.read(bytes)) != -10){
//            System.out.println(new String(bytes,0,len));
//        }
                        BufferedReader br = new BufferedReader(new InputStreamReader(is));
                        //    GET / web HTTP/1.1

                        String line = br.readLine();
                        System.out.println(line);
                        String[] arr = line.split(" file:///C:/Users/admin/Desktop/pinyougou/index.html");
                        String htmlpath = arr[1];
                        FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + htmlpath);
                        OutputStream os = socket.getOutputStream();
                        os.write("HTTP/1.1 200 OK\r\n".getBytes());
                        os.write("Content-Type:text/html\r\n".getBytes());
                        os.write("\r\n".getBytes());

                        while ((len = fis.read(bytes)) != -1) {
                            os.write(bytes, 0, len);
                        }
                        fis.close();
                        socket.close();
                        }catch(IOException e){
                            System.out.println(e);
                        }
                }
            }).start();
        }
    }
}

2020080605041

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值