2015-07-15 2 views
0

Я строю систему, с одной стороны, приложение для Android, которое использует связь HTTPURLConnection с другой стороной, которая является C# HttpListener. По этому каналу они обмениваются данными XML.C# HttpListener сбрасывает соединение

Это работает очень хорошо, за исключением некоторых более крупных данных. Когда я пытаюсь сообщить об этом, я вижу, что XML с Android прибывает на приложение C#, на которое отвечает приложение C#. Однако, прежде чем данные поступят на Android, я получаю «Сброс соединения с помощью сверстника». исключение.

Это Android код:

URL url = new URL(urlString); 
connection = (HttpURLConnection)url.openConnection(); 
connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); 
connection.setDoOutput(true); 
connection.setFixedLengthStreamingMode(tel.length()); 
connection.setReadTimeout(30000); 

// write our telegram... 
OutputStream output = new BufferedOutputStream(connection.getOutputStream()); 
output.write(tel.getBytes()); 
output.flush(); 

и вот ответ гласил:

InputStream input = new BufferedInputStream(connection.getInputStream()); 
if (connection.getResponseCode() == HttpStatus.SC_OK) { 
    String r = null; 
    byte cbuf[] = new byte[connection.getContentLength()]; 
    if (input.read(cbuf, 0, connection.getContentLength()) != -1) { 
     r = new String(cbuf); 
    } 
    reply = Telegram.fromString(r); 
} else { 
    throw new ProtocolException("HTTP Error code: "+connection.getResponseCode()); 
} 

и это C# код:

httpListener = new HttpListener(); 
httpListener.Prefixes.Add(String.Format("http://*:{0}/", port); 
httpListener.Start(); 
+0

Я думаю, что это тайм-аут. Внутри объекта вы устанавливаете тайм-аут. Проверьте объект подключения. –

+0

@MetehanToksoy это не таймаут. Это сброс соединения. Но я постараюсь сделать тайм-аут выстрелом. –

+0

Что делать, если наоборот? Я имею в виду, что на вашей стороне сервера будет тайм-аут? –

ответ

1

Оказывается, connection.getContentLength() не всегда совпадает с количеством байтов, считанных в input.read(), поэтому ожидание вызова ожидается (и, в конце концов, сервер сбрасывается, как это делается, я думаю).

Чтобы исправить, я переписал принимающую сторону:

int bufs = 256, read; 
ByteArrayOutputStream cbuf = new ByteArrayOutputStream(bufs); 
byte[] tempbuf = new byte[bufs]; 

while ((read = input.read(tempbuf, 0, bufs)) != -1) { 
    Log.d(PocketApplication.TAG, "Read "+read+" bytes."); 
    cbuf.write(tempbuf); 
} 

и теперь он работает нормально. Слишком большой размер bufs заставляет его снова сбой (например, с 1024, возникает та же проблема).

Смежные вопросы