Как управлять циклом диалога запрос-ответ с сервером - PullRequest
0 голосов
/ 03 января 2012

Я пишу простую клиент-серверную систему, и возникает вопрос: как структурировать мой клиентский код, чтобы заставить запрос-ответ POST работать в цикле?

В данный момент это выглядит примерно так (и сейчас это НЕ цикл):

  1. открыть HttpURLConnection
  2. установить свойства
  3. setDoOutput (true)
  4. запись в выходной поток
  5. закрытие потока вывода
  6. новый DataInputStream
  7. чтение ответа
  8. выход из метода

Я не уверен, какие объекты мне нужно сохранить для следующих итераций, а какие следует закрыть.

Ответы [ 2 ]

1 голос
/ 04 января 2012

Проведя собственное «исследование» на эту тему (благодаря форумам Google и Nokia Developer), я пришел к окончательному просмотру своего кода. Это цикл загрузки файлов:

path = Paths.get(requestString);
in = Files.newInputStream(path);

int i = 0;
while ((bytesRead = in.read(buf)) != -1) { 
    URL u = new URL(defaultURL);
    huc = 
        (HttpURLConnection) u.openConnection();
    huc.setRequestMethod("POST");
    huc.setDoOutput(true);
    huc.setDoInput(true);

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

    // thanks to dku.rajkumar for the following block of code ! 
    InputStreamReader reader =  
        new InputStreamReader(huc.getInputStream());
    char[] cbuf = new char[400];
    reader.read(cbuf);
    reader.close();

    String s = new String(cbuf);
    messagebuffer.append(s + "\n\n");

    huc.disconnect();

    Thread.sleep(16);
}
1 голос
/ 03 января 2012

вам нужно сохранить объект подключения, и вы должны использовать setDoInput(true) для чтения данных, но если вы просто хотите прочитать responseCode и responseMessage, вам не нужно InputStream.проверьте код ниже.

HttpURLConnection connection =(HttpURLConnection)new URL("url").openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-type", "text/xml"); // depend on you
connection.setRequestProperty("Accept", "text/xml, application/xml"); // depend on you
connection.setRequestMethod("POST");
OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
writer.write(yaml);
writer.close();
int statusCode = connection.getResponseCode();
String message = connection.getResponseMessage();

для InputStreamReader

connection.setDoInput(true);
InputStreamReader reader =  new InputStreamReader(connection.getInputStream());
char[] cbuf = new char[100];
reader.read(cbuf); 
// there are 3 read method you can choose as per your convenience 
//and put a check for end of line in while loop for reading whole content. 
reader.close();
...