2012-10-27 3 views
0

클라이언트 - 서버 기반 게임을 만들고 있지만 서버에서 패킷을 보내는 데 문제가있는 경우가 있습니다.소켓에서 전체 패킷을 보내십시오.

서버에 연결된 각 클라이언트에는 자체 인스턴스 (클래스 이름 Peer)가 있습니다. 이 인스턴스의 이름은 bufferByteBuffer입니다. 피어 클래스는 Runnable이므로 각 클라이언트는 고유 한 스레드를가집니다.

서버는 클라이언트에 다른 유형의 패킷을 보낼 수 있습니다. 서버는 패킷의 첫 번째 바이트가 'opcode'이므로 클라이언트가 어떤 패킷인지 알 수 있습니다. 클라이언트가 opcode를 알고 있으면 패킷의 크기도 알 수 있습니다.

Peer 클래스의 스레드에있는 while-loop의 모든 틱에서 ByteBuffer의 모든 패킷이 클라이언트에 보내집니다. 그러나 다른 스레드가 같은 시간에 바이트를 넣기 때문에 바이트 버퍼에 절반의 패킷이있는 경우가 있습니다. 그런 다음 클라이언트는 opcode를 읽지 만 패킷의 바이트는 누락됩니다.

이것은의 ByteBuffer에 바이트를 보내는 피어 클래스의 코드는 다음과 같습니다

   ByteBuffer buffer = this.buffer.duplicate(); 
       this.buffer.clear(); 
       int size = buffer.position(); 
       buffer.flip(); 
       byte[] data = new byte[size]; 
       buffer.get(data); 
       out.write(data); 

가 어떻게이 전체 패킷을 전송해야 할 수 있습니까?

답변

0

ByteBuffer 대기열과 별도의 스레드를 사용하여 생산자 - 소비자 패러다임을 사용하여 패킷을 보냅니다. 모든 제작자 스레드가 고유 한 ByteBuffer를 갖고 있는지 확인하고 각 ByteBuffer는 완료되면 큐에 넣습니다.

관련 문제