Java 服务器使用 SOCKET 下载文件通过同一机器上的浏览器上传到它 1
Java Server using SOCKET to download a file upload to it via a browser on the same machine1
我有一个使用套接字的 java 服务器。我有一个 html 文件,其中包含一个可用于上传和发送文件的表单。服务器如何在不阻塞的情况下下载该文件。浏览器从不关闭连接,它只是挂在那里我使用输入流中的 readLine() 发出哔哔声,但它阻塞了。有没有办法解决?
在此感谢您的帮助。
谢谢
请说明您的要求,您的步骤似乎很混乱。
- 你的程序运行是客户端还是服务器端?
- 你能展示一下你的代码吗?并显示是什么阻止了你?
- 如果能画出程序的工作流程就更好了。
感谢您的补充,请问您要通过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 形式上传)安全更改为磁盘。
谢谢你的时间
我有一个使用套接字的 java 服务器。我有一个 html 文件,其中包含一个可用于上传和发送文件的表单。服务器如何在不阻塞的情况下下载该文件。浏览器从不关闭连接,它只是挂在那里我使用输入流中的 readLine() 发出哔哔声,但它阻塞了。有没有办法解决?
在此感谢您的帮助。 谢谢
请说明您的要求,您的步骤似乎很混乱。
- 你的程序运行是客户端还是服务器端?
- 你能展示一下你的代码吗?并显示是什么阻止了你?
- 如果能画出程序的工作流程就更好了。
感谢您的补充,请问您要通过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 形式上传)安全更改为磁盘。 谢谢你的时间