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

조회수 6525회

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

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

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

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

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

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

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

    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.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을 참고해서, 원하시는 형태로 바꿔서 쓰면될 것 같습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)