강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Sungwon Jung님의 프로필 이미지
Sungwon Jung

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Session #1

Disconnect에 관한 질문입니당

작성

·

219

1

빨간색으로 동그라미 쳐진부분을 제가 실수로 누락해서 프로그램을 실행하니 

이와 같이 삭제된 개체에 액세스 할수 없다고 에러가 나옵니다.

그래서 Thread.Sleep()안의 시간을 100 10 1 0으로 줄여봣는데

1일때까지는 에러가 안나오는데 0부터 에러가 나오더라구요

말그대로 삭제된 개체에 어떤 작업을 하여서 에러가 나오는건데 프로그램의 흐름이 어떤 과정으로 진행되어서 이렇게 됏는지 파악이 잘안되서 답답한 마음에 이렇게 질문 남깁니다. ㅠㅠ

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

AcceptHandler에서 하는 코드를 유심히 보면,

1) session.Send로 메시지를 보내고
2) Thread.Sleep로 잠시 대기하고 
3) session.Disconnect을 이용해 연결을 끊어버립니다

일상으로 비유하면
1) 전화를 받아서 한마디를 한 다음
2) 잠시 대기하고
3) 전화를 끊어버리는

것과 유사합니다.

현재는 간단한 테스트를 하기 위해 클라한테 메시지를 보내고,
잠시 대기한 다음에 끊어버리는 것인데요.
물론 나중에 게임 서버를 다 조립하게 되면,
메시지를 보내고 바로 끊는게 아니라
클라가 게임을 마치고 종료할 때 비로소 네트워크 연결을 끊게 됩니다.

아무튼 1 단계의 Send는 보낸다고 즉시 처리되는게 아닙니다.
왜냐하면 상대방 쪽에서 데이터 수신하는 과정을 거쳐야 하기 때문이죠.
그래서 간단하게 테스트를 하기 위해 잠시 강제로 대기를 타고 있는데
그것이 2번의 Thread.Sleep에 해당합니다.
만약 대기타는 2번 부분을 삭제하고,
메시지를 보내마자 3번 Disconnect를 해버리면,
수화기를 들어서 "여보세ㅇ~~"를 말함과 동시에 전화를 끈 것과 똑같아집니다.
연결이 끊겼으니 더 이상 메시지를 전송할 수 없고
그래서 저런 SocketException이 일어나는 것입니다.
뭔가 엄청 큰 문제가 일어난 것은 아니고,
말 그대로 전화를 꺼버린 다음에 말하고 있으니
당연히 전송될 수 없기에 저렇게 에러를 띄워 주는 것이죠.

결론 :
저 부분은 깊이 생각하실 필요 없고
어차피 나중에 가면 바로 보내마자 Disconnect를 하진 않습니다.

0

Sungwon Jung님의 프로필 이미지
Sungwon Jung
질문자

설명 감사드립니다 이해 됏어요

Sungwon Jung님의 프로필 이미지
Sungwon Jung

작성한 질문수

질문하기