#1
27 января 2012 в 22:12
Есть следующий код (клиент). Он выполняет отсылку большого файла на сервер. Код рабочий. Единственное что мне в нем не нравиться - факт того что 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. <br /><br />
package myPkg;<br /><br />import java.io.*;<br />import java.net.HttpURLConnection;<br />import java.net.URL;<br />import java.nio.file.Files;<br />import java.nio.file.Path;<br />import java.nio.file.Paths;<br /><br />public class MyLogic {<br /><br /> public MyLogic() {<br /> }<br /><br /> private String defaultURL = "http://localhost:8080/myapp/test";<br /><br /> public String sendPostRequest() {<br /><br /> OutputStream os = null;<br /> StringBuffer messagebuffer = new StringBuffer();<br /> HttpURLConnection huc = null;<br /> DataInputStream dis;<br /> InputStream in = null;<br /> Path path;<br /> byte[] buf = new byte[32 * 1024];<br /> int bytesRead = 0;<br /><br /> try {<br /><br /> path = Paths.get("D:\\downloads\\testfile"); <br /> in = Files.newInputStream(path);<br /><br /> URL u = new URL(defaultURL);<br /><br /> int i = 0;<br /><br /> while ((bytesRead = in.read(buf)) != -1) {<br /><br /> huc = (HttpURLConnection) u.openConnection();<br /> huc.setRequestMethod("POST");<br /> huc.setDoOutput(true);<br /> huc.setDoInput(true);<br /><br /> os = huc.getOutputStream();<br /> os.write(buf, 0, bytesRead);<br /> os.flush();<br /> os.close();<br /><br /> System.out.println(i++ + " " + bytesRead);<br /><br /> dis = new DataInputStream(huc.getInputStream()); <br /> int ch;<br /><br /> long len = huc.getContentLength();<br /> if (len != -1) {<br /> for (int k = 0; k < len; k++)<br /> if ((ch = dis.read()) != -1)<br /> messagebuffer.append((char) ch);<br /> else {<br /> while ((ch = dis.read()) != -1)<br /> messagebuffer.append((char) ch);<br /> }<br /> }<br /> dis.close(); <br /> int statusCode = huc.getResponseCode();<br /> String message = huc.getResponseMessage();<br /> messagebuffer.append("status code=" + statusCode + "\n");<br /> messagebuffer.append("response message=" + message + "\n");<br /><br /> Thread.sleep(16);<br /> }<br /><br /> huc.disconnect();<br /><br /> } catch (Exception ex) {<br /><br /> messagebuffer.append(ex.toString());<br /><br /> } finally {<br /><br /> try {<br /> if (in != null)<br /> in.close();<br /> } catch (IOException ignored) {<br /> }<br /> try {<br /> if (os != null)<br /> os.close();<br /> } catch (IOException ignored) {<br /> }<br /> try {<br /> if (huc != null)<br /> huc.disconnect();<br /> } catch (Exception ignored) {<br /> }<br /><br /> }<br /> return messagebuffer.toString();<br /> }<br />}