서비의 다락방

뒤로 검색

InputStream.read()

2010/07/20 19:54

제가 만든 서버에서 보낸 데이터가 xml 형식으로 바이트 스트림으로 해서 받는데 in.read로 받았더니 byte 버퍼에 태그단위로 하나씩 들어가는데다가 디버그해봤더니 in.read라는 문장은 받은 xml 태그 수만큼 반복해서 실행되고 전체 xml을 받아서 파싱하려고 Stringbuffer를 이용해서 append 하려고 했더니 이것도 안되네요..

안녕하세요 질문자님.
질문 내용을 제가 정확히 이해한 건진 모르겠습니다만 제가 이해한 내용은
보내는 서버 측에서는 예를 들어, "<tag>내용</tag>" 스타일의 문자열을  byte[]로 변환하여
outputStream.write( byte[] );
하고 있고 클라이언트 측에서는
[code]
while ((readLength = inputStream.read(input, 0, input.length)) != -1) {
    stringBuffer.append(  new String( input )  );
}
[/code]
과 같은 동작을 하고 있다고 생각이 됩니다.

질문 내용 중 ' in.read라는 문장은 받은 xml 태그 수만큼 반복해서 실행되고' 라고 하신 걸로 미루어보아 데이터는 정상적으로 들어오고 있다고 판단됩니다. 받은 데이터를 가공하는데 어려움을 느끼고 계신 건 아닌가 하는 생각이 드네요.

우선 작성하신 클라이언트 쪽이 서버에서 보내주는 xml을 다 받으면 while 문을 빠져 나오는지 확인해 보시고요. 정상적으로 while문을 빠져 나온다면 유입된 Data를 가공하는 문제가 될 거고 그렇지 않다면 서버 측의 outputStream 에 write() 하는 부분을 확인하셔서 stream을 확실히 끝내고 있는지 확인하셔야 할 것 같습니다.

참고로 제가 작성한 소스를 첨부합니다.
첨부한 소스는 xml 형식의 문서를 읽어들여 byte 형식으로 전송하여 수신부에서 file과 문자열로 복원하는 코드가 작성되어 있습니다. Server.java 와 Client.java 는 일반적인 자바 bolocked Socket 프로그래밍 방식을 취하고 있습니다. 실제로 확인해야 하는 부분은 ByteArrayTransporter 클래스에서 클라이언트에 Data를 전송하는 부분과 Client 클래스에서 java.nio.ByteBuffer 를 이용하여 입력 데이터를 처리하는 부분 정도가 될 거 같습니다.



ByteArrayTransporter.java
[code]
   byte[] byteArray = new byte[1024];
   int readLength = 0 ;
   while ( (readLength = fileInStream.read(byteArray, 0, byteArray.length) ) != -1 ){
     out.write(byteArray, 0, readLength);
   }
   out.flush();
   out.close();  //<-- 스트림 끝내기
[/code]

Client.java
[code]   ByteBuffer bBuffer = ByteBuffer.allocate(102400);
   while ((readLength = bin.read(input, 0, input.length)) != -1) {   //byteBuffer에 byte[] 쓰기
      bBuffer.put(input, 0 ,readLength );
   }   //ByteBuffer 에 담긴 문자열 확인
   System.out.println( new String(bBuffer.array() , "UTF-8" ) );
[/code]

Tags

ByteBuffer, java, socket, 소켓, 자바
이 페이지는 Textcube 1.10.9 : Tempo primo 로 구동됩니다 데스크탑 화면