2012-06-22 3 views
1

У меня есть следующий код:InputStreamReader сокета не читает запрос POST полностью

ServerSocket ss = new ServerSocket(2351); 

Socket s = ss.accept(); 
InputStreamReader in = new InputStreamReader(s.getInputStream()); 
writer = new PrintWriter(s.getOutputStream()); 
writer.flush(); 

cbuf = new char[buf_length]; 
in.read(cbuf); 
inputLine = new String(cbuf); 

Я побежал четыре подряд отправляет на мой сервер, и когда я отлаживать код выше он правильно работает в три раза. В другой раз следующий мой inputLine, что читается из сокета:

POST /record HTTP/1.1 
Content-type: application/soap+xml;charset="utf-8";action="" 
Accept: application/soap+xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
User-Agent: JAX-WS RI 2.1.5-b03- 
Host: localhost:2351 
Connection: keep-alive 
Content-Length: 2197 

И содержание всего 2197 вместо пробелов содержание 2197 длины. Это действительно странно, и я застрял. Любая помощь приветствуется. Благодарю.

+0

Звучит как проблема на стороне клиента - пожалуйста, разместите соответствующий код оттуда. Кроме того, вам действительно нужно учитывать фактические байты, прочитанные в вызове 'in.read (cbuf)', вместо того, чтобы предполагать, что он действительно заполняет буфер. – Perception

+0

Что вы видите, если вы исследуете поток данных с помощью Wireshark? Если данные передаются как пробелы, проблема возникает у клиента. –

ответ

0

Я постараюсь сделать ответ EJP более конкретным. Вместо

n.read(cbuf); 
inputLine = new String(cbuf); 

Вам нужно сделать что-то вроде:

StringBuilder sb = new StringBuilder(); 
int charsRead; 
while ((charsRead = n.read(cbuf)) != -1) { 
    sb.append(cbuf, 0, charsRead); 
} 
inputLine = sb.toString(); 

Это не может быть ответом на вопрос, который вы просите, но это, безусловно, ошибка в коде вы публикуемую.

2

Вы предполагаете, что in.read() заполняет буфер. Вы не можете этого допустить. См. Javadoc. Обязательно читать хотя бы один символ или возвращать -1 из-за EOS.

+0

Но проблема в том, что in.read() имеет материал в буфере. Заголовок HTTP читается полностью. Длина контента называется 2197, что означает, что предполагается, что из HTTP-запроса должно быть 2197 символов. Единственное, что буфер не имеет этих конкретных символов. – OVB

+0

@OVB Поскольку вы игнорируете значение, возвращаемое read(), вы * не можете знать *, сколько данных было фактически прочитано. – EJP

+0

Верно, что :) .. Я попробую это .. спасибо – OVB

0

@EJP: Я переписал свой код, и он, наконец, работает. Проблема заключалась в том, что in.read() в первую очередь считывал только заголовок запроса POST с первой попытки. Я должен был проверить поле длины содержимого, и если он был меньше числа символов, прочитанных, как вы указали, мне пришлось снова сделать in.read(), чтобы получить запрос полностью. Спасибо всем, ребята!

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