Java

자바로 1:1 채팅하기

검정콩 2022. 5. 12. 17:28

<지난 이야기>

db를 했다가 자바를 했다가 왔다갔다 천방지축 어리둥절 빙글빙글 돌아가는 검정콩의 하루...

드디어 네트워크를 공부하게 되는데....

과연 초코딩에 네트워크 게시글을 쓸 수 있을까?

 

험난한 자바의 길...

 

 

누가 이렇게 개판으로 만들었냐고 한다면 바로 접니다.

오늘 공부한 내용은 자바로 1:1 채팅 코드를 짜는 것으로...

클래스를 4개나 만들어야해서 열받지만 다 짜고 채팅을 쳐보면 내가해냄! 을 외칠 수 있다.

우선 클라이언트와 서버를 먼저 만들고, 서버와 클라이언트가 메시지를 보내는 기능을 수행하는 sender 스레드와

메시지를 받는 기능을 수행하는 receiver 스레드를 생성해준다. 

소켓을 생성한 뒤 소켓정보를 받아 sender와 receiver 스레드에 넣어 메시지 보내기와 받기를 동시에 처리한다.

 

- Server

서버소켓을 만들고(포트번호 7777을 개방했다) 접속요청이 오면 수락한 뒤

socket을 Sender와 Receiver 스레드에 넣어 실행해줄 것이다. 

 

- Client

혼자서 해볼거라 ip주소는 그냥 localhost로, 포트번호는 7777로 설정해주었다. 

Client 역시 socket을 Sender와 Receiver 스레드에 넣어 메시지 보내기와 받기를 동시에 처리한다.

 

- Sender

메시지 보내기 전용 스레드로, 부모 Thread 에서 run()을 오버라이드하여 따로 개조해준다.

scanner로 메시지를 입력받아 전송할 것이다.

getOutputStream으로 socket으로부터 OutputStream을 가져오고,

스레드를 계속 반복할 것이기 때문에 scan으로 입력받은 메시지를 msg에 넣어

writeUTF로 oos가 msg를 사용할 수 있게 한다. 이후 바로 flush 메서드로 자원을 제출한다.

 

- Receiver

Receiver는 메시지 받기 전용 스레드로, 누군가 메시지를 주면 그 내용을 InputStream으로 받아온다.

getInputStream()을 통해 socket으로부터 InputStream을 가져오고, ois에 넣는다.

ois에는 받은 메시지가 들어있기 때문에, readUTF로 이를 읽고 msg에 넣어준다.

이 과정은 while 반복문으로 계속 반복된다.

 

- 출력

좌 java 콘솔창 우 cmd

cmd에 패키지 이름과 클래스 이름을 치면 서버에 접속이 완료되었다고 뜬다.

이제 cmd에서 메시지를 치면...

메시지가 전송되었다. 서버에서 메시지를 받았으니 답장을 치면...

무사히 1:1 채팅이 되는 것을 알 수 있다. 이제 다른 컴퓨터와 채팅을 하고싶다면 클라이언트의 localhost를 접속하고자하는 컴퓨터의 ip주소로 바꾼 뒤 재실행하면 된다.