안녕, 세상!

서로 다른 인터넷에서 채팅 프로그램 구현하기(포트포워딩) 본문

카테고리 없음

서로 다른 인터넷에서 채팅 프로그램 구현하기(포트포워딩)

dev_Lumin 2020. 8. 7. 14:04

(1) 클라이언트, 서버 컴퓨터가 똑같은 컴퓨터일 경우 (가상 환경 x)

 

java의 네트워크 프로그래밍을 공부하고 나서 채팅 프로그램이 너무 만들고 싶어서 여기저기 알아보다가 채팅 프로그램을 따라서 만들었습니다.

제가 따라서 만든 채팅 프로그램의 구조는 다음 그림과 같습니다.

채팅 서버에 접속한 채팅 클라이언트들이 서로 소통을 하기 위해서 보내고자 하는 메시지를 채팅 서버에 보내면 해당 내용을 채팅 서버에 접속한 클라이언트들에게 브로드 캐스팅되는 형식입니다.

 

이러한 형식의 채팅 프로그램을 구현시켰는데 대부분의 실습들은 한 대의 컴퓨터로 설명합니다.

한대의 컴퓨터 내에서 실습을 진행하게 되면 다음과 같습니다.

 

우선 클라이언트 컴퓨터가 서버 컴퓨터에 접속을 하려면 서버 컴퓨터의 ip주소와 port 번호를 알아야 합니다.

한 대의 컴퓨터에서 실습을 하게 되면 클라이언트 컴퓨터와 채팅 서버가 같은 네트워크에 있는 경우이므로 다음 그림과 같이 표현이 가능합니다. ( 이 그림에서 채팅 서버 포트 번호는 제가 임의로 8765라고 정한 겁니다.)

127.0.0.1의 의미는 자신이 접속한 해당 ip주소, 즉 자기 자신의 네트워크를 말하는 것입니다.

 

위와 같이 한 대의 컴퓨터에서 구현을 해서 실행이 잘 되었지만 채팅서버의 컴퓨터와 채팅 프로그램의 컴퓨터가 같은 상태로 설명해서 이 채팅 프로그램이 정말 서로 다른 컴퓨터에서 작동하는지 궁금증을 참아낼 수가 없었습니다.

 

 

 

(2) 하나의 공유기(같은 네트워크)에서 서버 컴퓨터와 클라이언트 컴퓨터가 다른 컴퓨터일 경우  

서로 다른 컴퓨터에서 실습을 하기 위해서 노트북을 서버 컴퓨터로 하고 데스크탑을 클라이언트 컴퓨터로 놓고 두 컴퓨터 모두 java 코딩을 해서 실습할 수 있는 eclipse 환경을 모두 설치해서 해당 기능에 맞는 코드들을 구현했습니다.

노트북에는 서버컴퓨터 역할을 할 서버 컴퓨터 코드와 클라이언트 코드를 짜서 서버컴퓨터 기능을 하게 하고, 데스크톱에는 오직 클라이언트 코드만 짜서 클라이언트 컴퓨터 기능을 하게 했습니다.

 

그리고 이번 실습은 같은 공유기, 즉 같은 네트워크에 접속시킨 상태에서 노트북(서버 컴퓨터)과 데스크톱(클라이언트 컴퓨터)은 각각 서로 다른 사설 ip를 받은 상황입니다.

노트북의 사설 ip : 192.168.0.5

노트북의 채팅 서버의 포트 : 8765         

데스크톱의 사설 ip : 192.168.0.221  

(다음과 같이 가정하겠습니다.)

그림으로 표현하면 다음과 같습니다.

 

이때 채팅 프로그램이 서로 통신이 되게 하려면 java 채팅 서버 코드에서 채팅 서버의 ip를 192.168.0.5로 설정하고, 채팅 클라이언트의 코드 부분에서 클라이언트들이 접속을 시도할 ip와 port번호를 설정하는 코드 부분이 분명히 있을 텐데 그 부분을 ip 주소는 192.168.0.5, port 번호는 8765로 설정해서 채팅 서버 컴퓨터부터 실행을 시킨 뒤 클라이언트들을 실행시키면 클라이언트들끼리 채팅이 잘 됩니다.

제가 실행했을 때는 공유기 ip가 192.168.35.0 이었네용 서버 ip주소는 192.168.35.245입니다.

 

 

위와 같이 같은 공유기 내에서 서로 연결해서 소통하는 거니까 코드에 사설 ip를 설정해도 잘 됩니다.

하지만 다른 네트워크에서 채팅 클라이언트로 채팅 서버에 접속을 하여 채팅을 할 때는 네트워크가 달라서 위의 공유기가 할당한 사설 ip주소로 설정하면 분명히 오류가 발생합니다.

그럼 다른 네트워크에 있는 채팅 클라이언트들이 채팅 서버에 접속하려면 어떤 설정을 해야 되고 어떤 ip주소와 port 번호로 접근을 해야 될까요?

이런 의문점을 가지고 찾아본 결과 포트 포워딩에 대해서 우선 알아야 됩니다.

 

 

 

(3) 포트 포워딩

가정에서 실습을 할 때 항상 문제가 되는 게 바로 공유기입니다.

공유기는 네트워크를 공유해서 정말 편리하고 유용한 도구이지만 네트워크를 막 공부를 시작하고 실습을 하는 입장에서 곤란한 도구입니다.

그 이유는 공유기는 공유기에 접속한 기기들에게 사설 ip를 제공하기 때문에 외부 네트워크에서 공유기 내부의 사설 ip를 어떻게 접근할까 라는 의문점으로 고생하게 합니다.

이러한 문제를 해결해주는 것이 바로 포트 포워딩입니다.

 

포트 포워딩은 외부의 네트워크에서 공유기와 연결된 기기에 접속을 시도하려고 할 때 공유기의 특정(지정된) 포트로 접속할 시 특정(지정된) 컴퓨터의 설정된 포트로 접속하게 해주는 기술입니다.

 

예시로 설명을 하면 다음과 같습니다.

공유기 A에서 포트 포워딩 설정을 자신의 8765 포트로 접속을 하면 192.168.0.5의 8765포트로 연결을 하게 설정을 하면 위와 같이 외부 컴퓨터에서 채팅 서버로 접속이 가능하게 됩니다.

 

공유기에 대한 포트 포워딩 설정은 다음과 같습니다.

저는 참고로 iptime 공유기를 사용하고 있습니다.

공유기 설정은 인터넷 브라우저 주소창에 192.168.0.1이라고 입력합니다.

창이 공유기마다 다르게 뜰 수 있지만 위와 같은 경우는 [관리 도구]를 누르고 로그인을 합니다.

처음부터 바로 로그인 창이 나올 수 도 있습니다.

이 경우에는 우선 로그인을 바로 해주시면 됩니다.

 

로그인 후 다음과 같은 창이 나타납니다.

오른쪽 메뉴바에서 [고급 설정] -> [NAT/라우터 관리] -> [포트 포워드 설정] 부분을 클릭하면 위와 같이 포트포워드 설정 화면을 보실 수 있습니다.

 

위에서 규칙 이름을 사용자가 임의로 지정해주시고 내부 ip 주소는 채팅 서버 주소를 입력해주시면 됩니다.

 

이때 채팅 서버 주소는 위의 공유기가 할당한 사설 ip를 기입하시면 됩니다.

 

프로토콜은 자신이 만든 프로그램에 맞는 통신의 프로토콜을 설정해 주시면 됩니다. 

(거의 대부분 TCP입니다)

 

외부 포트 부분은 위에서 설명한 공유기의 포트번호입니다. 

원하는 포트번호 범위를 선택해 주시면 됩니다.

저는 외부 컴퓨터에서 공유기의 8765 포트로 접속 시 채팅 서버의 8765 포트로 접속시킨다고 했으므로 외부 포트 부부분에 8765~8765라고 입력했습니다.

 

내부 포트 부분은 접속시키게 하고자 하는 내부 ip주소의 포트번호입니다.

저는 8765~8765라고 작성을 했습니다.

 

모든 설정을 다 기입했으면 [완료] 버튼을 누르면 됩니다!!

 

 

그 후 채팅 프로그램의 코드를 수정해야 합니다.

채팅 서버의 프로그램 코드에서 자신의 ip와 포트번호를 가리키는 부분은 공유기가 할당해준 사설 ip 주소인 192.168.0.5로 설정하고 포트번호는 8765로 주면 됩니다.

채팅 클라이언트의 코드 부분에서 클라이언트들이 접속을 할 서버의 ip와 port번호를 설정하는 코드 부분이 분명히 있을 텐데 그 부분을 ip 주소는 공유기의 ip 주소를 입력하고, port 번호는 8765로 설정해서 채팅 서버 컴퓨터부터 실행을 시킨 뒤 클라이언트들을 실행시키면 클라이언트들끼리 채팅이 잘 됩니다.

 

이렇게 되면 서로 다른 네트워크에서도 채팅이 가능한 프로그램을 구현하신 것입니다!!!

채팅 서버의 ip주소와 포트번호가 변하지 않고 채팅 서버가 계속 실행이 되고 있는 상태에서 여러분이 만든 채팅 프로그램을 가진 외부의 컴퓨터들이 여러분이 구축한 채팅 서버를 통해 소통을 할 수 있게 만드신 것입니다!!

 

 

java 채팅 프로그램뿐만 아니라 tcp/ip 소켓 프로그래밍 공부를 하실 때 포트 포워딩 기술을 이용하면 만드시는 실습 프로그램이 다른 네트워크에서도 접속 가능한 서버를 구현할 수 있습니다!!

 

Comments