본문 바로가기
Programming/> Java

[Java] 콘솔 소켓 채팅 프로그램

by 니키ᕕ( ᐛ )ᕗ 2015. 10. 19.

서버부분을 공부하고 싶었는데 그나마 적당한 것이 멀티스레드를 사용하는, 파일 전송도 되는 멀티 채팅 프로그램인 것 같아 제작해보았다.

밍기적 거리면서 했기 때문에 기간은 상당시간 소요되었고... 예외처리를 잡는다고 다 하긴 했지만 어디서 빵꾸가 났을지는 장담하지 못하겠다.


소스코드는 요기로~



멀티스레드를 사용하기위해 agent라는 클래스를 사용한 것은 학원 다닐 때 강사님이 했던 방법이다.

나름 괜찮은 방법인거 같아서 그대로 차용함.



1. Server와 FileServer가 개별적으로 돌도록 Singleton 패턴을 사용했다. Server 포트는 8080 FileServer는 8081




2. 클라이언트가 연결 대기중인 서버의 소켓에 연결을 시도 한다.



3. 연결된 클라이언트의 소켓 정보를 토대로 SeverAgent를 생성한 후, 아이디를 입력하고, 중복여부를 확인하는 작업을 거친다.



4. 같은 방법으로 2번째 클라이언트를 붙여준다.



5. Client2가 서버로 메세지를 전송하면 서버는 broadcast 메소드를 통해 전체 접속한 사용자에게 메세지를 보낸 사용자의 아이디와 메세지를 전달한다.




6. Client2가 FileServer로 파일전송을 한다.



7. 서버에 업로드하는 방식을 사용할 것이기 때문에 별도의 요청없이 바로 업로드를 진행한다. 파일명의 중복을 막기 위해 uuid를 사용한다.



8. 파일업로드가 완료되면 파일정보를 해쉬맵 리스트 형태로 보관하고 Client2와 FileServer의 연결이 종료된다.





9. 종료되는 즉시 FileServer는 Server를 호출하여 파일을 업로드한 사용자를 제외한 나머지 사용자들에게 파일을 다운로드할 것인지 묻는다. 

여기서 Server는 전달만 하고 사용자들의 응답에 따라 클라이언트가 FileServer로 연결을 시도한다.






10. 파일을 다운로드하는 경우에는 FileServer에 uuid값을 찾아 다운받는 방식이며 다운로드가 완료된 다음엔 

파일정보 해쉬맵에서 해당 파일의 수신자 리스트에서 다운받은 사용자 명단이 삭제 된다. 





11. 다운을 받지 않는 경우라면 다운로드 과정없이 삭제 작업이 진행된다. 또한 해당 파일의 수신자가 더이상 없는 경우 파일은 삭제 된다.


'Programming > > Java' 카테고리의 다른 글

[Java] Comparable, Comparator  (0) 2017.10.04
[Java] java.lang.UnsatisfiedLinkError Exception  (0) 2015.10.30
[java] Servlet & JSP 정리  (0) 2015.08.16
[java] jdk 환경변수 설정  (0) 2014.07.20

댓글