2014-12-11 2 views
0

Java로 게임 서버를 작성하고 있습니다. 게임 서버에서 일반적으로 사용되는 한 클라이언트가받은 데이터를 가져와 클라이언트 방 (다른 클라이언트)을 통해 배포해야합니다. 현재 각 클라이언트는 자체 스레드를 생성하고 그 위에 작업합니다. 그러나 플레이어 간 관계를 정의하는 데 문제가 있습니다. 같은 방에있는 다른 모든 플레이어에게 메시지를 보내야하는 채팅과 같은 것을 어떻게 제어합니까? 나는 모든 스레드가 종종 메시지를 찾아서 자신의 클라이언트로 보내는 메시지 큐와 같은 것을 생각하고있다.Java 다중 스레드 서버

또한 멀티 스레드를 한꺼번에 처리 할 수있는 제안이 있지만 NIO에 익숙하지 않으며 서버는 이미 SocketThread으로 작성되었습니다.

요약 : 내 고객 (스레드)이 서로 이야기하게하려면 어떻게해야합니까? 아니면 거기에 더 나은 스레드가 아닌 대안?

+0

Netty와 같은 일부 프레임 워크를 사용하면 훨씬 쉽게 응용 프로그램을 확장 할 수 있습니다. 연결된 클라이언트에게 데이터를 브로드 캐스팅하는 것이 간단한 작업이 될 것이라고 확신합니다. 약간의 학습 곡선이있을 수 있지만, 그만한 가치가있을 것입니다. –

+0

@JurgenCamilleri 내가 netty 시작 설명서를 읽을 때 나는 열중했다. 이렇게 많은'건축업자'와'공장'은 나를 울게한다! 당신은 그것을 배우기위한 더 나은 자료를 알고 있습니까, 아니면 그것은 진실이고 검증 된 방식입니까? –

+0

Netty에 대한 제 경험으로 방금 예제를 작성하고 직접 시도하기 시작했습니다. 그때 내가 필요로했던 것들을 위에 쌓아 놓기 시작했고, 내가하지 않은 것을 버렸다. 이 YouTube 채널에는 유망 해 보이는 시리즈가 있습니다. https://www.youtube.com/channel/UCIA0yteJXa5JgRqxFJYQbEQ –

답변

1

내가 사용한 한 가지 접근 방법은 Thread를 확장하는 Server 클래스와 클래스를 디자인하는 것입니다.

Server 클래스는 모든 스레드를 생성하고 현재 실행중인 모든 스레드 목록을 유지합니다.

스레드 클래스에서 Socket 객체를 사용하여 입/출력 스트림을 만듭니다. 이러한 쓰레드 중 하나가 말할 내용이 있으면 스트림을 통해 서버와 통신 한 다음 현재 실행중인 모든 스레드에 해당 메시지를 전달하는 것은 서버에 달려 있습니다.

이 간단한 자바 튜토리얼은 실제로 나를 많이 도와주었습니다.

https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html

+0

아, 별도의 스레드에서 서버가 각각의 스레드에서 클라이언트를 청취합니까? 클라이언트 작성과 서버 수신 사이에 지연이 발생하지 않을까요? –

+0

확실히, 어떤 종류의 지연이 있습니다. 얼마나 지연 될 것으로 예상됩니까? – Jakeway

+0

사실 지금은 공연하는 것처럼 들립니다. 마스터 스레드의 유일한 임무는 클라이언트 스레드가 브로드 캐스팅과 물건을 요구하는지 감시하는 것입니다. 깔끔한 것 같아요, 네티가 나에게 효과가 없다면 시도해 볼 수도 있습니다. 고맙습니다! –

-1

이봐 난 단지에 대한 라이브러리를 만들어! https://www.dropbox.com/s/xcy1uyyyc610lb5/JSock.rar?dl=0 다운로드하여 프로젝트로 가져 오십시오. ReadMe.txt를 읽으면 대부분의 내용을 설명합니다. 내가 더 설명해 줄 필요가 있으면 그냥 물어보십시오!

+1

링크의 관련 부분을 답안에 포함시켜 코드 예제를 설명하십시오. 현재이 답변은 매우 스팸성이며, 특히 DropBox .rar에 연결됩니다. GitHub를 사용하여 공유하지 않는 이유는 무엇입니까? 더 합법적 인 것 같습니다. – CubeJockey

1

제안 된 솔루션 역시 Jakeway와 유사합니다. 나는 정확히 같은 방식으로 이런 식으로 구현했다.

서버는 하나 개의 스레드를 만들고 해당 스레드에서 서버 소켓을 만들고

클라이언트가 서버에 연결 연결을 기다리는 것입니다. 서버는 ClinetSocket을 만들고이 소켓을 스레드에 전달합니다. 이 스레드는 소켓의 생성에, 클라이언트 측 양식 서버

에서 클라이언트/서버 통신을 담당, 하나 개의 스레드가 시작되고 스레드는

가 보라 클라이언트에서 클라이언트/서버 통신을 담당 아래 링크에서 기성품 코드의 일부. rmi vs servlets vs sockets

그들 사이의 클라이언트 통신에 관한 : 프로 소켓 사용의 & 단점, 아래 링크를 방문에 대해서는

chat example 1

chat example 2

? 가능하지 않다.클라이언트가 서버에 메시지를 보냅니다 & 다른 클라이언트에게 메시지를 보내야합니다. 당신이 야후를 보면 종류의 당신은

2) 서버는 클라이언트의 목록을 가지고 채팅 룸에서 서버에 메시지를 보내드립니다)

1 채팅은

3) 서버가 보내드립니다 대화방에 클라이언트를 가입 방에 구독하는 모든 고객에게 메시지