2014-03-02 4 views
1

Java에 클라이언트 - 서버 응용 프로그램을 쓰고 있습니다.Java에서 데이터 형식을 무시하는 데이터 스트림을 읽는 방법

  1. 는 클라이언트가

    • 요청 라인 등록 노드에 헤더 행의 수를 HTTP 형식의 메시지를 보내
    • 빈 줄
    • 과 : 절차는 다음과 같습니다 몸.
    • (ASCII 텍스트)
  2. 등록 노드는 서버와 비슷한 형식의 메시지를 보냅니다.

  3. 클라이언트와 서버는 대화 할 수 있습니다 (SIP와 유사).

는 지금, 나는 이미 클라이언트와 서버의 소켓을 만들었 는데도 입력 및 출력 데이터의 DataInputStream과 DataOutputStream 정렬을 사용하려는 경우, 나는 또한의 DataInputStream에서이 외에도 readDouble 같은 방법 때문에 데이터의 유형을 결정해야 .

나는 어떻게 해야할지 모르겠다.

죄송합니다. 내 설명이 약간 모호한 경우 여기에서 전송할 수있는 몇 가지 샘플 메시지입니다.

REGISTER [email protected] SIPL/1.0CRLF 
To: [email protected] 
From: [email protected] 
Call-ID: a74fbCRLF 
CSeq: 0CRLF 
Expires: 200CRLF 
Contact: 74.125.226.161:20132CRLF 
CRLF 

SIPL/1.0 200 okCRLF 
To: [email protected] 
From: 74.125.226.161:20300CRLF 
Call-ID: 9934bcd2CRLF 
CSeq: 10CRLF 
Content-Length: 21CRLF 
Contact: 74.125.226.161:20305CRLF 
CRLF 
file=foo 
characters=10 

정말 적용 해주십시오.

+0

모든 것이 HTTP 헤더와 ASCII 텍스트 인 경우 왜 double과 같은 유형을 처리하려고합니까? 아마도 (InputStreamReader를 통해) 리더를 사용하는 것이 더 적절할 것입니까? – helderdarocha

+0

'DataInputStream'의'.readDouble()'은 double의 _binary 표현으로 기대되는 8 바이트를 읽습니다; 귀하의 덤프 주어진, 이건 당신이 원하는 아니에요 ... – fge

+0

그냥 데이터 스트림 입력에 대한 예제를 설정합니다. 그렇다면이 데이터를 입력하고 출력하는 가장 좋은 방법은 무엇입니까? 아직도 데이터 스트림? 또는 scanner, printwriter 등의 다른 것? @@@@@@@@@@@@@@ – ChesterL

답변

1

ASCII 텍스트를 읽고 행을 처리해야하기 때문에 독자와 작성자를 사용하고 행을 읽을 수있는 java.io.BufferedReader으로 데이터를 읽을 수 있습니다.

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

String line = reader.readLine(); 
StringBuilder buffer = new StringBuilder(); 
while (line != null) { 
    buffer.append(line); 
    line = reader.readLine(); 

    // you can check here if the line is empty and decide only to read the header 
    // or to split your header and body into different buffers 

} 
String fullText = buffer.toString(); 

텍스트 데이터를 전송하는 경우, 당신은 또한 비슷한 사용할 수 있습니다 당신은 자바 (7), 사용하는 경우, finallyclose() 방법과 try-catch-finally 블록

PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 
writer.println("GET/HTTP/1.1"); 
writer.println("Header: value"); 
writer.println(); // end of header 
... 
writer.flush(); // if you need to flush the buffer before closing 
writer.close(); // when done - flushes and closes 

장소 다 (또는 자원을 사용해보십시오)

+0

대단히 감사합니다! BufferedReader는 바이너리 I/O 용인 반면, 텍스트 용 I/O에는 PrintWriter가 아닌가? – ChesterL

+0

@helderdarcocha .dat 파일을 전송하려면 어떻게해야합니까? – ChesterL

+0

판독기 및 기록기는 문자 I/O 용입니다. 원시 데이터 스트림 (InputStream 및 OutputStream)은 2 진 I/O 용입니다. InputStreamReader와 OutputStreamWriter는 바이너리 스트림을 문자 스트림으로 변환하는 래퍼입니다. – helderdarocha

관련 문제