2012-08-31 3 views
0

Java에서 작은 멀티 플레이어 게임을 만들려고합니다. 나는 TCP 연결이 작동하고있어,하지만 지금은 단지 문자열을 전송할 수 있습니다. 더 정교한 데이터를 패킷으로 전송하고 싶습니다.이 데이터에는 게임을 동기화하는 데 필요한 모든 데이터가 들어 있습니다. 일종의 맞춤 구조 나 클래스 인스턴스의 데이터를 하나의 tcp 패키지로 전송할 수 있습니까? 또는 무엇이 좋은 방법이 될 것입니다 (나는 봤지만 나는 내 필요에 맞는 것을 찾지 못했습니다)?Java TCP 통신 전송 데이터 구조

답변

2

일반적으로 여기에서 찾을 키워드는 serialization입니다. 데이터 구조를 소켓 또는 다른 전송 매체를 통해 보낼 수있는 바이트 덩어리로 변환하는 프로세스입니다.

이 작업을 수행하는 한 가지 방법은 Java 용 바인딩이있는 Google Protocol Buffers 라이브러리를 사용하는 것입니다.

+0

작동하지만 클라이언트와 서버 프로젝트를 단일 프로젝트에 병합하고 각 클래스마다 클래스를 포함해야했습니다. 나는 두 개의 클래스가 두 프로젝트에서 동일했는지에 상관없이 인스턴스를받을 때 예외를 던질 것입니다. 2 가지 프로젝트로 작업 할 수있는 방법은 없습니까? – DLabinac

+0

두 프로젝트가 다른 프로젝트에서는 작동하지 않는 구체적인 이유는 모르지만 (정확히 말하면 다른 모든 프로젝트는 동일 함) 정확히 무엇을했는지 모른 채 말하기는 어렵습니다. 그러나 서로 다른 프로젝트에서 프로토콜 정의의 사본 두 개를 유지하면 오류가 발생하기 쉬우므로 오류가 발생하기 쉽습니다 (동기화되지 않는 경우). 아마도 처음 두 프로젝트에 포함 된 프로토콜 정의를 가질 수 있습니다. –

+0

위험 : 모든 버그가 동일하고 게임이 멈춘 것처럼 보이는이 버그가있었습니다. 이는 캐싱 때문이며, 이러한 경우 재설정 메소드를 사용해야합니다. 내가 찾은 예제 : objOut.reset(); – DLabinac

0

- 소켓을 가로 지르는 일반 문자열에 만족하지 않으면 Serialization을 사용할 수 있습니다.

-Serialization은 동일한 java 프로그램을 사용하여 데이터를 쓰고 읽을 때 사용해야합니다.

-Serialization는 평평하고 저장 및 검색 중에 각각 개체를 팽창.

- 그것 실제로하지 개체 있지만 이러한 데이터는 Serializable을 경우 Instance variables

0

I would like to transmit more sophisticated data in packets, which would contain all the necessary data for synchronizing the game.

.... 저장된 사용 후 힙에 동일한 개체를 부활하는 데 사용됩니다 (예 : 데이터가 프리미티브, 문자열 및 프리미티브 배열 또는 문자열 배열로 구성된 경우) 데이터를 보유하려면 Vector, List, Map 등과 같은 표준 Collection을 사용할 수 있습니다. 그들은 직렬화 가능합니다 (그들의 문서를 확인하십시오). 그래서 당신이 필요 그냥 사용하기 :

objectOutputStream.writeObject(data) 

당신이 패킷을 전송 ObjectOutputStream를 사용한다고 가정. 그러나 사용자 지정 데이터 구조를 만들 필요가 없다면 다른 사용자가 지적한 것처럼 java.io.Serializable 태그를 사용해야합니다.

주 : Serializable을 구현하는 클래스에서 해당 클래스의 인스턴스 변수가 모두 Serializable 유형인지 확인해야합니다.