본문 바로가기
안드로이드

[Android] inputstream StreamCorruptedException 에러 해결

by 코딩히어로 2023. 1. 18.
728x90

1


안드로이드 소켓통신을 하면서 Stream을 여는 과정에서 문제가 발생했습니다

해당 안드로이드에서는 이미 클라이언트로 Socket을 열어 사용 중이었는데

업체의 요구에 따라서 서버로도 동작해야 하는 상황에 ObjectInputStream을 여는 과정에서

중복되므로 에러가 발생했습니다

 

StreamCorruptedException 에러는 시스템에서 Stream을 여는데 다른 한쪽이 정리되지 않고

중복적으로 Stream을 열어주려고 할 때 발생합니다

 

구글 서칭결과 new를 통해 accept 시에 매번 Stream 새로 생성하여 열어주면

해결이 된다고 했으나 해당 방법으로는 에러가 해결되지 않았습니다

 

해당 에러는 간단하게 해결이 가능한데 ObjectInputStream이 아닌 그냥 InputStream을

사용해서 Socket을 구성하게 되면 간단하게 해결이 가능합니다

 

이미 Client로 동작하고 있는 시스템에 서버로서 Retry라는 명령을 받는 서버를 구성하였는데

해당 코드는 다음과 같이 스레드로 구성하였습니다

@Override
public void run() {
    try {
        ServerSocket serverSocket = new ServerSocket(port);
        while(stop!=false){
            if(Ssocket==null) {
                Ssocket = serverSocket.accept();
                Log.i("디버깅", "### 서버연결");
            }
            try {
                InputStream is = Ssocket.getInputStream();
                OutputStream os = Ssocket.getOutputStream();
                int input = is.read(byte_data);
                if (input == -1) {
                    Ssocket = null;
                }
                while (input != -1) {
                    if ((byte_data[0] == 0x52) && (byte_data[1] == 0x45) && (byte_data[2] == 0x54) && (byte_data[3] == 0x52) && (byte_data[4] == 0x59)) {
                        manual_down_state = true;
                        Log.i("디버깅", "### 수동전송명령 입력");
                    }
                    Arrays.fill(byte_data, (byte) 0x00);
                    input = -1;
                }
                is.close();
                os.close();
            }catch (SocketException e){
                Ssocket.close();
                Ssocket=null;
                Log.i("디버깅","### 서버소켓 에러....");
            }
            SystemClock.sleep(1);
        }
        Ssocket.close();
        Log.i("디버깅","### 서버소켓종료");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

위 코드를 기반으로 더 많은 메시지를 처리하는 서버도 구성이 가능합니다

InputStream의 read 함수는 소켓이 끊어질 경우 -1을 리턴하기 때문에

이 경우 해당 소켓을 null처리하여 새로운 접속을 받아들일 수 있게 처리합니다

728x90
반응형

댓글