티스토리 뷰
해결했어야하는 문제는 총 10가지이며
내가 진행한 단계(step)은 7단계이다
분량이 생각보다 많다.
First Step
내 컴퓨터와 상대방의 컴퓨터가
다른 와이파이를 썼을때 채팅이 되는지 확인하기
1. 상대방 컴퓨터와 채팅시 IP설정 문제
IP를 서버를 연 컴퓨터의 IPV4입력 말고
공인IP(공유기IP)로 설정했어야 함
->다른 컴퓨터에서 상대방의 사설IP로 접근은 불가능하기 때문
2. 방화벽문제
방화벽 인바운드 규칙적용 혹은 방화벽 전부 해제로 접근가능하게함
3. 포트포워딩
포트포워딩 설정으로 공인IP입력시 해당 포트에 사설IP(서버를 연 컴퓨터의)를 매칭시켜 접속가능하게함
이 3가지의 문제를 해결하니 상대방 컴퓨터와 내 컴퓨터와 채팅이 가능해졌다.
Second Step
파일을 직접 실행하지 않고버튼을 눌렀을때 서버오픈, 채팅접속이 되도록 구현하기
4.서버오픈 버튼, 채팅접속버튼을 만들고
버튼을 누르면 들어오게 구현했는데,
서버오픈버튼을 누른 순간 커서가 멈춤(클라이언트가 들어올때까지 무한기다림)
그래서 서버를 스레드로 만들음
그러니까 마우스멈춤 문제 해결
5.전체 프로그램 종료문제
채팅방 나가면
그 채팅방 창만 꺼져야되는데
전체프로그램이 종료돼버림
System.exit(0)때문인데
그전에는 서버와 채팅이 독립적이었는데
Hello.java안에 버튼을 두개 만들어
버튼을 누르면 hello의 main스레드안에
서버와 채팅이 들어가서
종속적이다
그래서 전체 프로그램이 종료된다
이문제는 System.exit(0) -> break로 변경해 해결함
Third Step
채팅방을 만들어
독립적으로 메세지를 보내게하기
(2명 접속하면 0번방, 또 2명 접속하면 1번방, 2번방 이런식으로 인원수대로 할당함)
6.채팅방 만들기
기존에는 한개의 채팅방에서 1:n으로 채팅했는데
1:1채팅 시스템을 만들기 위해
방을 만들어 방끼리 대화하도록 만들어줘야했다
그래서 room이라는 클래스안에
userlist, roomid가 있고,
roommanager 클래스를통해 해당유저가 속한 room의 정보를 받아오도록 구현하고자함
그런데 서버를 스레드만들어서 그런지
흐름이 상당히 이상해짐
그래서 서버는 항상 열려있다 가정하고
서버의 스레드는 지움
그 후 채팅, 알림 버튼을 hello에 생성 후,
인원수대로 2명씩 받아서(채팅 -> 알림 클릭순)
방을 0,1,2....순으로 생성 및 할당을 해주어
각 방끼리 독립적으로 채팅을 가능하게함
각 handler에 roomid필드를 만들어
그 roomid를 roommanager에 보내
방을 받아
그 방에 있는 userlist에게만 채팅을 보내도록함
->이거 하나 한다고 카페 17시에가서 5시에 나옴
이 때 되는거보고 정말 눈물 흘릴뻔했다..
이 기억은 아마 평생 못잊을듯
Fourth Step
인원수 말고 방번호로 채팅방 접속하게하기
7.방 번호로 접속하게하기(인원수대로x)
기존에는 버튼을 누른 순서대로 방번호가 0,1,2,...이런식으로 할당됐는데
인원수대로말고 채팅입장 버튼마다 방번호를 할당해
방번호로 들어오게 하려고한다.
이걸 하기위해 채팅을 눌렀을때 방을 만들고 알림을 눌렀을때 이미 생성된 방으로 들어가게 할 것
그러면 hello.java에서 채팅을 눌렀는지
알림을 눌렀는지 서버에 전달해주어야하는데
Server도 메인스레드로 실행되고
Hello도 메인스레드로 실행돼서
Static 클래스를 만들어도
같은 변수를 공유하지 못하는 문제가 발생됨
그래서 같은 메인스레드에서 실행되도록 고칠예정
Fifth Step
각 사용자의 방번호를 서버에 전달해주기(이건 실패)
handler에게 전달해주어 handler에서 방 생성 및 유저 방안에 집어넣기 성공
8.채팅버튼을 누르면 글쓴이에게 알림이가고
알림을 누르면 채팅버튼누른사람이 있는 방으로
1대1 채팅이 가능하게 하려 했는데
알림버튼 마다 동적으로 다른 방번호를 할당해주는 방식에 어려움을 느껴(GUI구현 난제)
알림버튼을 누르면 채팅방으로 입장하게하지말고
알림버튼은 클릭할수없게 만들고
알림이 오면 그 알림을 보고
그 게시글 채팅버튼을 누르면 그 게시글에 할당된 방번호로 들어가게구현함
즉 게시글 하나마다 채팅방이 있고
1:1이 아닌 1:n으로 소통가능하게 변경함
약간 이런느낌으로 버튼마다
같은 방번호로 할당해주는 느낌
따라서
ClientObject(int roomid)
클라이언트 생성자에 방번호를 전달해주고
InfoDTO에 설정해서 클라이언트의 방번호를
서버에 전달해주려했는데
만약 handler가 없으면
Server에 input,output stream이 있었겠지만
handler에서 stream으로 받고 주어서
Client에서 Server로 방의 정보를 전달해줄 수 없는 상황이 돼버렸다
서버에서 방을 추가하는 방식으로 코드를 짰기때문에
나는 선택해야 했다
1.handler에서 방을 만든다
2.handler 코드를 없애고 server코드에 합친다
그런데 handler코드를 너무 잘 짜놔서
1번방식을 선택했다
이 handler 클래스에서 자기자신을 room에 어떻게 참조해서 추가시켜줄까 고민이 됐다
방법은 이렇게 했다
handler클래스 안에
private ChatHandlerObject handler를 만들어주고
Server에서 handler1, handler2를 생성해주고
handler1에는
socket, outputstream, inputstream의 정보를 받아주고
handler2는 handler1을 가르켜주는 용도로 사용한다
즉, handler2의 run()을 시작하는데,
handler2의 reader와 writer는 handler2가 가리키고있는 handler1의 reader와 writer로 변경해준다
즉 Client의 방 정보 --> Server --> handler1 --> handler2
이 handler2를 이용해 handler1을 방으로 추가시켜주는데 성공했다.
즉, 1번버튼을 누르면 1번방으로,
2번버튼을 누르면 2번방으로 채팅방에 입장할 수 있게 구현했다고 볼 수있다.
이게 근데 잘짠코든지는모르겠...ㅋㅋ
Sixth Step
메인 프로그램에 연동
9. 각 게시글마다 채팅버튼이 있고,
채팅버튼마다 할당된 번호가 다르게 구현하는 것은
gui 담당이 잘 해놓았다
따라서
나는 Server의 run이 메인프로그램의 main메소드에서 실행되게하고,
버튼을 눌렀을때 각 버튼에 할당된 채팅방으로 유저가 입장할 수 있도록
코드를 추가해 주었다.
문제점 : 서버는 한 사람만 실행하도록 해도 되는데,
모든 사람이 프로그램을 실행하면 서버가 가동되도록 돼있다.
이부분은 server의 run이 main메소드에서 실행이 되어야하고,
그렇지 않고 다른 메소드에서 실행되면 클라이언트가 들어올때까지 무한 멈춤현상이 발생한다
이 부분은 아쉽게 해결하지 못했다.
Seventh Step
음식물 게시판, 생필품 게시판과의 게시글 번호가 같으면
같은 채팅방에서 만나는 문제 해결
10.
이 문제가 생길거라 예상했다
그래서
짝수를 음식물, 홀수를 생필품에 할당할까 고민했는데
그게 더 어려웠다.
그래서
roommanager에 room의 종류를 두개 만들어주었다
기존에는 그냥 room만있었다면
이제는 necroom, necroomid, foodroom, foodroomid
이렇게 필드를 새로 만들어주어
음식물 게시판의 1번채팅하기 버튼을 누르면 necroom이 생성되고, necroomid로 roommanager로 전달해
necroom으로 들어가게하고
생필품 게시판의 1번채팅하기 버튼을 누르면 foodroom이 생성되고, foodroomid로 가서
foodroom으로 들어가게한다.
즉, 방 번호는 같지만 방의 종류가 달라 둘은 독립적으로 실행되게 구현했다.
이번에 채팅기능구현을 맡으면서 느낀점
네트워크를 더 공부해보고 싶다.
컴퓨터와 컴퓨터가 데이터를 주고받는게 당연한거라 생각했는데,
직접 프로그램을 만들어보니
눈에 보이지 않는 엄청난 고생과 기술이 들어가는 것을 알게되었고
더 깊이 공부하고 싶다는 생각이 들었다.
채팅방 기능 시연영상
github 링크 : https://github.com/Sinamon-CBNU/Sinamon/tree/chatandgui
- Total
- Today
- Yesterday
- 로스트아크 캐릭터
- 리눅스
- bfs
- html #웹 #웹사이트 #플레이리스트
- CSS
- javascript
- git
- SpringBoot
- git commit 수정
- DDL
- 프로그래머스
- oauth
- oauth2.0
- html
- authorization_code
- git 예전 커밋 수정
- 클로아
- DML
- 우분투
- 오픈소스
- authorization code
- kloa
- 데이터 3법
- Android Studio
- SQL
- 데이터베이스
- 인프콘2024
- infcon 2024
- 데이터3법
- 2024인프콘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |