방송 통신 위원회에서 무슨일로...?

오늘 제 블로그의 리퍼러 로그를 확인하던 차에 처음 접하는 주소에서 제 블로그를 방문한 기록을 확인하였습니다.
리퍼러가 http://mail.bcc.go.kr 로 시작하는 걸로 보아 어느 정부기관의 메일함에서 링크로 찾아온 것 같더군요.
bcc.go.kr이 어디인지 궁금해서 잠시 찾아가 봤더니.. 무려 방송 통신 위원회더군요..
방통위에서 제 블로그에 무슨 일로, 그것도 메일함의 링크를 타고 방문을 했는지 궁금해 지는 순간이었습니다.
혹시... 저작권 관련해서 제 블로그가 신고라도 들어간 걸까요?
제 블로그의 글이 너무 주옥같아서 방통위에서 읽어보려고 들어오신 건 아닐 테고.. 이것 참, 소심한 블로거 간
떨리게 하는군요..

제 블로그에 포스팅한 글 모두가 사회 통념이나 현행법상 문제가 될만한 부분이 티끌만큼도 없다고 자신하지
못하는 서비이기 때문에 '도둑이 제 발 저린 격'인 게지요.

그나저나 정말 궁금하군요.. 메일함에 제 블로그의 어떤 포스팅이 어떻게 묘사되고 있는지 말이예요..

2008/04/14 14:48 2008/04/14 14:48
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 전 그래서 현행법상 문제가 될 소지가 '눈꼽'만큼이라도 있다면 아예 포스팅을 안한다지요;;;
    (이거 좋은 건지 나쁜 건지;;;; 대신 띵받게 하는 일이 있음 불을 뿜죠;;; 조만간 불 뿜을 포스팅이 하나 준비 중이라능;;)

소켓통신 서버/클라이언트 통신시 IO Blocking 상태에 빠지는 코드와 해결 방안

2008/04/03 19:15

서비 JAVA , , ,

java study 질답 게시판에서 서버-클라이언트 소켓 통신을 하는데 통신이 단절된다는 내용의 질문을 접했습니다.

질문자의 원글 보기..


코드를 보면 지극히 정석으로 코드를 작성 해 둔 상황입니다. 하지만 동작 중 어느 순간이 되면 통신이 안되기 시작하죠..
이는 비단 자바뿐만 아니라 다른 언어로 소켓 프로그래밍을 하더라도 동일한 현상이 발생할 겁니다.
원 질문자께서 저 코드로 어디까지 다버깅을 해 보셨는지는 알지 못하겠지만, 제가 판단하건데 동작이 안되는 시점은
필시 클라언트와 서버 양쪽 모두 while((read = bin.read())!=-1) 문에서 서로의 데이터를 기다리느라
블록 상태에 빠졌기 때문일 겁니다.

왜? 무슨 이유로 read() 에서 블록 상태에 빠졌을까요?

원인은 서버 소켓 쓰레드인 ClientHandler 쪽에서 찾을수 있습니다. 
서버 소켓 코드를 보시면 클라이언트에서 받은 데이타를 읽는게 끝이나면 클라이언트로 데이타를 전송하는
절차적 구조로 작성 되어있는데요..

문제는 클라이언트로부터 데이터가 유입되는
[code]// received InputStream in = null;
BufferedInputStream bin = null;
in = m_socketClient.getInputStream();
bin = new BufferedInputStream(in);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read;
while ((read = bin.read()) != -1) {
    baos.write(read);
}
[/code]
부분이 원인입니다... 감이 좀 잡히시나요?

한번 API를 확인 해 볼 필요가 있겠군요. API를 보시면.. BufferedInputStream의 read() 메소드의 리턴 값을
the next byte of data, or -1 if the end of the stream is reached. 라고 명시하고 있습니다.
'스트림의 끝까지 갔을 때 -1을 리턴 한다'라고.. 데이터가 끝났을 때 -1이 아닙니다.

비록 클라이언트가 보낸 데이타는 끝이 났을지언정 클라이언트와 연결된 스트림은 끝나지 않았단 말이죠.
쉽게 말하자면 bin.read()에서 block된 상황은 BufferedInputStream인 bin이 끝나지 않았으며, 언젠간
새로운 데이터가 유입될테니 대기중이다.
는 얘기지요.

이제 좀 감이 잡히시죠? ^^
결국 지금의 코드 대로라면 서버 소켓은 클라이언트에서 보낼 데이터를 영원히(혹은 time out까지) 기다리고 있는거죠..

이제 원인을 알았으니 해결책에 대한 아이디어도 떠오르셨을거라 생각합니다.
이런 경우 클라이언트 소켓도 쓰레드로 돌려야 하지만 인풋 스트림과 아웃풋 스트림도 각각 쓰레드로 처리 해
주셔야 질문과 같이 blocking으로 어플리케이션이 멈춰있는 문제를 회피할 수 있습니다.
 

2008/04/03 19:15 2008/04/03 19:15
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    비밀방문자

    관리자만 볼 수 있는 댓글입니다.

  2. Blog Icon
    Nereid

    관리자님 안녕하세요. 프로그래밍중 안되는 부분이 있어
    해결책을 찾아보다가 여기서 같은 케이스를 찾게되서요.

    제가 초보라 해결책이 잘 떠오르지 않는데
    저런경우 인/아웃 스트림 쓰레드 처리에 대하여 좀 알려주실수 있을까요?

    부탁드립니다. 감사합니다.