Welcome, guest. You can be a Login или register
Author
Topic title
UAC
Offline
Бывший UAC и Sodomizer
833 posts
Karma 27
Есть следующий код (клиент). Он выполняет отсылку большого файла на сервер. Код рабочий. Единственное что мне в нем не нравиться - факт того что openConnection() должен вызываеться в цикле, а disconnect() - за рамками цикла. С помощью такого кода я пытаюсь сделать не совсем коректную вещь - multiple POST-запросы через HttpURLConnection. Из документации стало ясным что "Each HttpURLConnection instance is used to make a single request but the underlying network connection to the HTTP server may be transparently shared by other instances". Потом наткнулся на вот такой пост на форуме (источник): "URLConnection по возможности использует одно физическое соединение при повторных обращениях к одному хосту (если не применять disconnect() после каждого запроса), хотя обьект URLConnection надо каждый раз создавать новый. Это, наверное, вводит в заблуждение." И вот стою на асфальте я в лыжи обутый, то ли лыжи не едут, то ли я еб...нутый... Неясно - нормальный ли это порядок вещей и правильно ли построен код. Поясните пожалуйста, если кто-то хорошо знаком с HTTP-протоколом и Java.

package myPkg;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class MyLogic {

public MyLogic() {
}

private String defaultURL = "http://localhost:8080/myapp/test";;

public String sendPostRequest() {

OutputStream os = null;
StringBuffer messagebuffer = new StringBuffer();
HttpURLConnection huc = null;
DataInputStream dis;
InputStream in = null;
Path path;
byte[] buf = new byte[32 * 1024];
int bytesRead = 0;

try {

path = Paths.get("D:\\downloads\\testfile");
in = Files.newInputStream(path);

URL u = new URL(defaultURL);

int i = 0;

while ((bytesRead = in.read(buf)) != -1) {

huc = (HttpURLConnection) u.openConnection();
huc.setRequestMethod("POST");
huc.setDoOutput(true);
huc.setDoInput(true);

os = huc.getOutputStream();
os.write(buf, 0, bytesRead);
os.flush();
os.close();

System.out.println(i++ + " " + bytesRead);

dis = new DataInputStream(huc.getInputStream());
int ch;

long len = huc.getContentLength();
if (len != -1) {
for (int k = 0; k < len; k++)
if ((ch = dis.read()) != -1)
messagebuffer.append((char) ch);
else {
while ((ch = dis.read()) != -1)
messagebuffer.append((char) ch);
}
}
dis.close();
int statusCode = huc.getResponseCode();
String message = huc.getResponseMessage();
messagebuffer.append("status code=" + statusCode + "\n");
messagebuffer.append("response message=" + message + "\n");

Thread.sleep(16);
}

huc.disconnect();

} catch (Exception ex) {

messagebuffer.append(ex.toString());

} finally {

try {
if (in != null)
in.close();
} catch (IOException ignored) {
}
try {
if (os != null)
os.close();
} catch (IOException ignored) {
}
try {
if (huc != null)
huc.disconnect();
} catch (Exception ignored) {
}

}
return messagebuffer.toString();
}
}