할로우David
10
2022-05-14 20:28:28
0
62

BufferedReader.readLine()을 수행하는 코드에서, SockeException: Connection reset 에러가 랜덤하게 발생합니다.


현재 멀티 스레드로, 각 스레드에서 소켓 통신을 담당하는 프로그램을 작성 중에 있습니다

(소켓 인스턴스 생성시 할당하는 ip host와 port는 동일합니다.)


6개의 스레드가 각각 소켓 인스턴스로부터 실시간으로 메세지를 받는 형식인데,

실행을 할 때마다 제대로 동작하는 스레드의 수가 다릅니다.


어떤 경우에는 6개 전부 정상 동작하여 제대로 메세지를 읽어 오기도 하고

어떤 경우에는 1개, 혹은 2개의 스레드가 밑과 같은 에러를 출력하고

나머지 스레드들은 정상 동작하여 메세지를 읽어오고 있습니다


java.net.SocketException: Connection reset
	at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
	at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
	at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
	at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
	at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
	at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
	at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
	at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
	at com.github.ethany.kafkatwitch.kafka.util.TempTwitchIrcConnection.readMessageFromOutputStream(TempTwitchIrcConnection.java:46)
	at com.github.ethany.kafkatwitch.kafka.util.TempTwitchIrcConnection.run(TempTwitchIrcConnection.java:26)
	at java.base/java.lang.Thread.run(Thread.java:834)
5월 14, 2022 8:02:06 오후 com.github.ethany.kafkatwitch.kafka.util.TempTwitchIrcConnection run


원인이 발생하는 코드를 찾아 보니, 

while ((line = bufferedReader.readLine()) != null)  

이 부근에서 SocketException: Connection reset이 발생한다고 합니다


public void readMessageFromOutputStream() throws IOException {
        String line = null;
        InputStreamReader inputStreamReader = new InputStreamReader(streamDto.getSocket().getInputStream(), StandardCharsets.UTF_8);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        while ((line = bufferedReader.readLine()) != null) {  /* SocketException: Connection Reset occurs on this line*/
            catchUnexpectedMessage(line);
        }
    }


스레드 동작을 위해 구현한 run method에서 위의 함수를 아래 코드와 같이 호출하고 있습니다

streaDto는 Socket instance, OutputStream을 wrapping한 dto 객체입니다.


public void run() {
        try {
            streamDto.getOutputStream().write(("JOIN " + channel + "\n").getBytes(StandardCharsets.UTF_8));
            logger.info("check if socket Connected: " + streamDto.getSocket().isConnected());
            readMessageFromOutputStream();
        } catch (IOException e) {
            logger.info("cannot connect to " + channel);
            e.printStackTrace();
        } finally {
            try {
                streamDto.getSocket().close();
                streamDto.getOutputStream().close();
            } catch (IOException e) {
                logger.info(e.getMessage());
            }
        }
    }


구글링을 하다가 okky에 올라온 관련 에러 글을 본 적이 있는데

http://okky.kr/article/581594

read를 실행하는 중 상대방 socket이 close 된 경우 일어날 수 있다고 합니다.

close를 하는 logic을 제가 client side에서 작성하진 않은 것 같은데

실행 때마다 랜덤하게 connection이 reset이 된다면 상대 서버에서 connection을 막은 걸까요?


만약 그렇다면 해당 connection reset 에러가 발생할 때마다 재 연결을 시도하는 로직을 어떻게 짜야 할까요? catch socketException을 한 후 catch 블럭에서 socket 생성 및 bufferedreader 객체를 생성해야 할까요



0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.