안드로이드 소켓통신시 데이터를 받을때 질문입니다.


소켓통신으로 데이터를 받아오려고 하고 있습니다

BufferedReader클래스를 활용 하여 readLine를 호출하여 데이터를 받고 있습니다.

그런데 서버에서 데이터를 보낼때 캐리지리턴이 없으면 데이터를 읽어오지 못합니다.

서버에서 데이터를 받을때 캐리지리턴은 포함하지 않는다고 가정한 상태에서

readLine함수를 사용해서 방법 말고 다른방법이 있을까요?

  • 2016년 04월 28일에 작성됨

조회수 701


2 답변


좋아요
1
싫어요
채택취소하기

이렇게 해 보시면 어떨까요. 출처

String dstAddress;
int dstPort;
String response = "";

try {
    socket = new Socket(dstAddress, dstPort);

    ByteArrayOutputStream byteArrayOutputStream = 
                  new ByteArrayOutputStream(1024);
    byte[] buffer = new byte[1024];

    int bytesRead;
    InputStream inputStream = socket.getInputStream();

    /*
     * notice:
     * inputStream.read() will block if no data return
     */
             while ((bytesRead = inputStream.read(buffer)) != -1){
                 byteArrayOutputStream.write(buffer, 0, bytesRead);
                 response += byteArrayOutputStream.toString("UTF-8");
             }

   } 
  • 2016년 04월 28일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • 감사합니다 간단하게 해결했습니다.    이엄지   2016.4.28 14:19     

보통 전체를 읽어오는 경우라면 다음과 같은 snippet을 참고하시면 됩니다.

InputStream is = ... ; // 소켓
OutputStream out = ...; // 읽어온 데이터를 보낼 곳.
byte[] buf = new byte[4096]; //
int nread = 0;
while( ( nread = is.read(buf) ) > 0 ) {
      // 입력스트림(소켓)으로 부터 읽어온 데이터의 길이가 0보다 크면...
     out.write(buf,0,nread);
      // 버퍼의 0번째부터 nread까지를 out에 쓰기
}

대부분의 I/O에서 EOF 까지 읽어오는 방법입니다.

위를 메모리에 복사하는 것이 목적이라면 out을 ByteArrayOutputStream으로 하면됩니다.

OutputStream out = new ByteArrayOutputStream();

위의 snippet을 참고해서, 원하시는 형태로 바꿔서 쓰면될 것 같습니다.

  • 2016년 04월 28일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close