2011-02-05 6 views
2

우선, 나는 이것이 학교 프로젝트라는 것을 인정할 것이므로 실제 코드보다는 방향성이 더 필요하다. 또한, java.net.HTTPURLConnection 클래스와 java.net.URL 클래스를 사용하여 도울 수 없습니다. ...Java에서 HTTP 메시지 읽기

Ok ... HTTP 서버를 읽는 데 문제가 있지만 Java에서 HTTP 서버를 만들고 있습니다. HTTP/1.1을 사용하고 연결이없는 경우 영구 연결을 허용해야합니다.이 연결은 이미 작동합니다. 그러나 끈기 때문에 파이프 라인을 따라 내려 오는 요청이 여러 개있을 수 있습니다.

메시지 본문의 길이를 결정하기 위해 Content-Length 헤더를 사용할 수 있다는 것을 알고 있습니다. 그 다음 메시지가 파이프를 따라 내려옵니다.

내 질문에 ...

  • 나는 문자로 바이트 또는 문자로 메시지 바이트 읽을 경우, 또는 내가 선으로 줄을 읽을 수 있습니까? 줄 단위로가는 것은 메시지 본문을 치기 전까지는 괜찮을 것입니다 ...
  • 메시지 본문을 바이트 형식으로 저장해야합니까, 아니면 String입니다. (HTML은 문제가 없지만 이미지 등은 중단됩니다. 문자열?)
  • 줄 단위로 읽을 수있게 해주는 스캐너가 있습니까? 그러면 메시지 본문을 때리면 getBytes (contentLength)를 호출하고 나에게 시체를 제공합니까?

다시 한번 감사드립니다!

편집 : 청크 또는 압축 된 데이터를 지원할 필요가 없습니다.

답변

2

바이트 배열로 읽는 것이 좋습니다. 그리고 줄 단위로 읽을 필요는 없지만 바이트 청크로 읽으십시오 (content-length를 청크 크기로 사용할 수 있습니다.) read (byte [])는 실제로 읽은 바이트 수를 반환하므로 여전히 호출해야 할 수도 있습니다 여러 번).

청크 인코딩에도주의해야합니다. 서버를 지원해야하는지 여부는 알지 못하지만 항상 클라이언트 코딩에 관심이 많기 때문에이 인코딩을주의하십시오.

+0

게시물 주셔서 감사합니다. 나는 다른 사람들도 말할 필요가있는 것을 보게 될 것이다. 나는 청크 인코딩에 대해 걱정할 필요가 없다는 점에 대해 질문을 수정했다. – mikesir87

+0

Ok ... 그래서 헤더를 아직 파싱 할 수 없다면 내용 길이가 무엇인지 어떻게 알 수 있습니까? – mikesir87

+0

@ mikesir87 : 음, 좋은 지적 ;-). 이 시점에서 당신은 정말로 선을 현명하게 읽어야합니다. 가장 쉬운 방법은 헤더 섹션을 종료하는 '\ r', '\ n', '\ r', \ 'n'시퀀스를 인식 할 때까지 문자 현명하게 읽는 것입니다. 지금까지 모든 캐릭터를 StringBuffer에 추가했습니다. 그런 다음 헤더를 가지고 바이트 배열을 분석하고 계속 읽을 수 있습니다. 이 방법은 성능에는 좋지 않지만 구현하기 쉽습니다. – yankee

1

제 2의 양키스의 견해 - 낮은 레벨에서 바이트 배열을 읽어야합니다. 이렇게하면 html과 이미지 모두에서 작업 할 수 있습니다. 상위 레벨에서는 항상 HTML 조각을 특정 인코딩으로 문자열로 변환 할 수 있습니다. 낮은 수준이 아닌 상위 수준에서 인코딩을 선택하는 것이 좋습니다.

버퍼를 사용하고 매번 새로운 바이트로 채 웁니다. 양키가 말했듯이, read 메소드에 대한 호출을 반복하고 반환 값을 확인해야합니다.

+0

독서에 사용하도록 권하는 특정 클래스? – mikesir87