마지막 라운드 과제를 진행하고 주말 쉬고 바로 교수님 연구에 투입됐다. 그리고 정신없이 달리다 보니 어느새 3주라는 시간이 흘렀다. 늦었지만 네트워크 연결을 어떻게 했었는지 기록으로 남기고 싶어서 글을 적는다.

육목게임 네트워크 연결하기

기한 : 7/2 ~ 7/6(오후 12시)

기능 : 서로 다른 피씨에서 접속해서 게임이 가능하게 만들어라!

많은 시간이 흘렀지만 그래도 네트워크를 어떻게 연결했었는지 하나하나 집어가면서 코드를 보이겠다!

먼저 내가 사용한 코드의 방법에 대해서 설명해보겠다. TCP 소켓 프로그래밍이라는 것을 이해하는데 조금의 시간이 소요됐다.

소켓프로그래밍이란 server와 client 사이에 통신 방법인데 소켓이 이 둘의 데이터를 주고 받을 수 있게 해준다고 한다.

그렇다면 여기서 소켓 프로그래밍을 이용해서 client와 client가 데이터를 주고 받을 수 있게 해주면 게임도 가능하게 된다는 걸 알게 됐다:)

<로직>

일단 Server는 client가 접속하게 되면 해당 client를 위한 receiver를 생성해주고 유저를 명단에 추가해준다. 그리고 Server는 receiver를 통해 받은 정보를 명단에 있는 유저들에게 뿌려준다!

말은 쉽지만 막상 코드는 socket과 thread와 다양한 것들이 섞여 있어서 이해가 마냥 쉽지 만은 않을 것이다. 나는 서버와 클라이언트를 이해하기 위해서 다음 사이트를 참고했다.

http://lktprogrammer.tistory.com/64

나는 서버에 db를 연동시켰다. 앞선 라운드에서 했던 것처럼 서버에서 db 정보를 받아오고 검색하고 할 수 있게 해서 유저들의 데이터를 db를 이용해서 관리할 수 있게 했다.

로그인 까지 하려다 보니까 진짜 시간이 너어어무 많이 걸렸다. 그리고 나는 특별히 대기자 명단을 만들어서 대전 신청이 가능하게 했고 대기자가 게임중인지 대기중인지 실시간으로 확인하게 했다. 경기 승패에 따라서 전적을 모든 사람들의 화면을 업데이트하게 했다.(이거하느라 정말 많은 시간이 걸렸다..)

코드 짠지 너무 오래라 자세한 코드 설명은 뒤로 하고 구현한 모습만 보자.

자세한 내용은 내 github를 참고하기 바란다.

https://github.com/gur5381/JavaStudy18-1

사진 모드선택

앞서 라운드에서 만든 게임의 내용도 보존하기 위해서 모드를 두개로 나눴다:)

사진 첫 화면

server가 db를 참조하면서 로그인과 회원가입이 가능하게 했다.

사진 회원가입 시 중복확인 모습

회원가입 시 username과 nickname을 검색하여 중복 여부를 확인하게 했다. 그리고 원하는 포켓몬을 고를 수 있게 해줬다:)

사진 회원가입 시 데이터 입력한 모습

비밀번호와 여러 정보를 확인한 후에 모든 데이터가 올바르게 입력되면 계정이 생성된다.

사진 회원가입 완료 시 메세지창 모습

계정이 생성됐다는 메세지와 함께 로그인 창으로 돌아간다.

사진 회원가입 완료 시 조나 정보가 추기된 모습

db에 조나라는 데이터가 추가 된 것을 볼 수 있다:)

사진 로그인화면

그럼 본격적으로 로그인 하는 것을 보여주겠다.

사진 대기 창 모습

내가 혼자 로그인하면 내 전적, 닉네임, 캐릭터를 보여준다.

사진 대기 창에 다른 유저 접속 시 모습

다른 유저가 로그인 하게 되면 대기자 명단을 repaint해서 대기자가 추가 되게 했다.

다음과 같이 유진이 로그인하자 자동으로 유진이 추가된다.

사진 대전 신청시 모습

이 때 유진이 대기자 명단에 있는 내 캐릭터를 클릭하게 되면 다음과 같이 challenge 메세지가 가게 된다. 여기서 승락 버튼을 누르면 자동으로 경기장으로 이동하게 된다.

사진 진혁 경기 모습

사진 유진 경기 모습

여기서 돌을 서로 주고 받을 수 있게 해주었다. 한사람이 돌을 놓게 되면 서버를 통해서 서로 돌의 위치를 보내줄 수 있게 했다.

사진 결과 창

그렇게 해서 한쪽이 돌을 6개 놓게 되면 여기에 맞춰서 승패가 결정되고 양쪽 화면에 모두 이 화면을 띄워줬다.

사진 전적이 최신화 된 모습

승패 판정후 자동으로 데이터가 최신화 되게 했다.

사진 전적 최신화를 포함해서 디비가 최신화 된 모습

db에 데이터가 최신화된 모습이다:)

자세한 코드를 설명해주고 싶지만 이미 시간이 많이 흘러서 하지 못하는 것을 이해해주기 바란다. 그래도 오랜만에 보는 데도 기분이 좋다.

서버에 데이터를 주고 받는 방법으로 String으로 보내서 split()을 사용하는 방법을 이용했는데 너무 주먹구구식으로 짰던 것 같아서 조금은 아쉽다. 일단 내 마음에 들지 않지만 그래도 여기까지 성과 낸 것으로 만족한다. 내일부터 육목대회 준비에 들어가게 되는데 코드를 다시 가다듬고 달려야겠다.

이렇게 자바 공부 모든 라운드를 마무리한다. 조금 늦었지만 교수님과 함께한 3주 너무 알찼고 값진 시간이었다. 각 라운드 마다 초반에 맞이했던 막막함을 하루 이틀이 지나가면서 해결해나가는 것을 보면서 진짜 뭐든 할 수 있을 것 같은 자신감이 생기는 중요한 시간이었다.

이제 교수님 연구도 마무리 단계이고 육목대회 준비에 매진할텐데 이 또한 최선을 다해서 달려보자! 남은 방학도 화이팅!!

내 github 주소는 여기있다:)

https://github.com/gur5381/JavaStudy18-1