클라이언트 - 서버 기반 게임을 만들고 있지만 서버에서 패킷을 보내는 데 문제가있는 경우가 있습니다.소켓에서 전체 패킷을 보내십시오.
서버에 연결된 각 클라이언트에는 자체 인스턴스 (클래스 이름 Peer
)가 있습니다. 이 인스턴스의 이름은 buffer
인 ByteBuffer
입니다. 피어 클래스는 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);
가 어떻게이 전체 패킷을 전송해야 할 수 있습니까?