Java 服务器使用 SOCKET 下载文件通过同一机器上的浏览器上传到它 1

Java Server using SOCKET to download a file upload to it via a browser on the same machine1

我有一个使用套接字的 java 服务器。我有一个 html 文件,其中包含一个可用于上传和发送文件的表单。服务器如何在不阻塞的情况下下载该文件。浏览器从不关闭连接,它只是挂在那里我使用输入流中的 readLine() 发出哔哔声,但它阻塞了。有没有办法解决?

在此感谢您的帮助。 谢谢

请说明您的要求,您的步骤似乎很混乱。

  1. 你的程序运行是客户端还是服务器端?
  2. 你能展示一下你的代码吗?并显示是什么阻止了你?
  3. 如果能画出程序的工作流程就更好了。

感谢您的补充,请问您要通过HTTP方式上传文件吗(socket方式写)。对于此要求,您可以查看 link link 了解 HTTP 的工作原理 [RFC 1867] (https://www.rfc-editor.org/rfc/rfc1867)

下面是socket方式的封装: 假设服务器提供以下 HTML:

 <FORM ACTION="http://server.dom/cgi/handle"
       ENCTYPE="multipart/form-data"
       METHOD=POST>
 What is your name? <INPUT TYPE=TEXT NAME=submitter>
 What files are you sending? <INPUT TYPE=FILE NAME=pics>
 </FORM>

用户在名称字段中键入“Joe Blow”,然后选择文本 文件“file1.txt”作为 'What files are you sending?'

的答案

客户端可能发回以下数据:

    Content-type: multipart/form-data, boundary=AaB03x

    --AaB03x
    content-disposition: form-data; name="field1"

    Joe Blow
    --AaB03x
    content-disposition: form-data; name="pics"; filename="file1.txt"
    Content-Type: text/plain

     ... contents of file1.txt ...
    --AaB03x--

如果用户还指定了图像文件“file2.gif”作为答案 到 'What files are you sending?',客户端可能会发送 返回以下数据:

    Content-type: multipart/form-data, boundary=AaB03x

    --AaB03x
    content-disposition: form-data; name="field1"

    Joe Blow
    --AaB03x
    content-disposition: form-data; name="pics"
    Content-type: multipart/mixed, boundary=BbC04y

    --BbC04y
    Content-disposition: attachment; filename="file1.txt"

Nebel & Masinter 实验 [第 9 页]

RFC 1867 基于表单的文件上传 HTML 1995 年 11 月

    Content-Type: text/plain

    ... contents of file1.txt ...
    --BbC04y
    Content-disposition: attachment; filename="file2.gif"
    Content-type: image/gif
    Content-Transfer-Encoding: binary

      ...contents of file2.gif...
    --BbC04y--
    --AaB03x--

我在端口上有服务器 运行。我希望它收集由 POST 请求发送的数据,该请求携带一个文件(不仅是文本,还有 png 图像)。 例如这里有一个服务器:

public void run() {
    try {
        InputStream is = insocket.getInputStream();
        PrintWriter out = new PrintWriter(insocket.getOutputStream());
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        String line;
        line = in.readLine();
        String request_method = line;
        System.out.println("HTTP-HEADER: " + line);
        line = "";
        // looks for post data
        int postDataI = -1;
        while ((line = in.readLine()) != null && (line.length() != 0)) {
            System.out.println("HTTP-HEADER: " + line);
            if (line.indexOf("Content-Length:") > -1) {
                postDataI = new Integer(
                        line.substring(
                                line.indexOf("Content-Length:") + 16,
                                line.length())).intValue();
            }
        }
        String postData = "";
        // read the post data
        if (postDataI > 0) {
            char[] charArray = new char[postDataI];
            in.read(charArray, 0, postDataI);
            postData = new String(charArray);
        }
        out.println("HTTP/1.0 200 OK");
        out.println("Content-Type: text/html; charset=utf-8");
        out.println("Server: MINISERVER");
        // this blank line signals the end of the headers
        out.println("");
        // Send the HTML page
        out.println("<H1>Welcome to the Mini Server</H1>");
        out.println("<H2>Request Method->" + request_method + "</H2>");
        out.println("<H2>Post->" + postData + "</H2>");
        out.println("<form name=\"input\" action=\"form_submited\" method=\"post\">");
        out.println("Username: <input type=\"text\" name=\"user\"><input type=\"submit\" value=\"Submit\"></form>");
        out.close();
        insocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如何使用此服务器将文件(通过 HTTP/1.1 POST REQUEST 形式上传)安全更改为磁盘。 谢谢你的时间