用TCP协议模式HTTP的PUT请求上传文件到tomcat服务器

1.问题描述

今天学习spring mvc时用到了一个jersey库,使用该库可以直接把文件上传到tomcat服务器。而在tomcat服务器端不需要写任何响应代码,只需要服务器处于运行状态,文件就可以上传到服务器中。jersey库是怎么做到的呢?猜测它是通过http协议的put请求将文件上传上去的。为了验证这个想法,我使用tcp协议模拟http协议看能不能将文件上传到tomcat服务器中。

2.环境搭建

2.1服务器端环境搭建

用j2ee版本的eclipse新建一个java web项目ssmImage19,在WebRoot文件夹下新建一个upload文件夹用于存放上传的文件,该文件夹不能为空,不然部署到服务器中之后,空文件有可能会被删除。新建一个tomcat服务器imgServer,并将项目ssmImage19部署到该tomcat服务器中,将Servers项目中imgServer-config目录下的web.xml(注意不是web项目中WebRoot/WEB-INF目录下的web.xml)中的readonly参数设置为false,允许向服务器写数据,否则上传文件时服务器会返回403错误代码。将imgServer的http协议端口改为8002,用默认的8080端口也可以,客户端代码需要与服务端端口保持一致即可。这里,我的tomcat服务器端口是8002,因此客户端也是连接的8002端口。最后,运行服务器imgServer。
用TCP协议模式HTTP的PUT请求上传文件到tomcat服务器_第1张图片

用TCP协议模式HTTP的PUT请求上传文件到tomcat服务器_第2张图片

2.2客户端环境搭建

新建一个java工程,客户端代码如下:

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


public class UploadFile {
    public static void main(String[] args) throws Exception{
        //Tomcat服务器的端口是8002
        Socket s = new Socket("localhost", 8002);//连接到服务端的端口
        OutputStream out = s.getOutputStream();

        upload("Chrysanthemum.jpg", "localhost:8002", out);
        upload("Desert.jpg", "localhost:8002", out);
        upload("Hydrangeas.jpg", "localhost:8002", out);
        upload("Jellyfish.jpg", "localhost:8002", out);
        upload("Koala.jpg", "localhost:8002", out);
        upload("Lighthouse.jpg", "localhost:8002", out);
        upload("Penguins.jpg", "localhost:8002", out);
        upload("Tulips.jpg", "localhost:8002", out);


        InetAddress sa = s.getInetAddress();
        String ip = sa.getHostAddress();
        sop("Server " + ip + "::" + s.getPort());

        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        int len = -1;
        len = in.read(buf);
        sop(new String(buf, 0, len));
        s.close();
    }

    private static void upload(String fileName, String host, OutputStream out) 
            throws IOException{
        FileInputStream fis = new FileInputStream(fileName);
        //模拟http put请求上传文件
        String head = "PUT /ssmImage19/upload/" + fileName + " HTTP/1.1\r\n" +
                "Host: " + host + "\r\n" +
                "Connection: keep-alive\r\n" +
                "Accept: text/html,application/xhtml+xml,application/xml,*/*\r\n" +
                "Accept-Encoding: gzip, deflate\r\n" +
                "Accept-Language: zh-CN\r\n" +
                "Content-Length: " + fis.available() + "\r\n" +
                "\r\n";
        out.write(head.getBytes());
        byte[] buf = new byte[1024];
        int len = -1;
        while((len = fis.read(buf)) != -1){
            out.write(buf, 0, len);
        }
        fis.close();
    }

    public static void sop(Object o){
        System.out.println(o);
    }
}

运行客户端代码,可以顺利将图片文件上传到服务器imgServer中。
用TCP协议模式HTTP的PUT请求上传文件到tomcat服务器_第3张图片

用TCP协议模式HTTP的PUT请求上传文件到tomcat服务器_第4张图片

你可能感兴趣的:(Java,Web)