Я создаю экспериментальный игровой сервер в Java
.
Клиент отправляет:
length: 22\r\n
playerId: 0\r\n
\r\n\r\n
this is a test message
Java
код для получения сообщения:
String message = "";
byte[] buf = new byte[20];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socketServer.receive(packet);
message += new String(buf, "UTF8");
buf = new byte[20];
packet = new DatagramPacket(buf, buf.length);
socketServer.receive(packet);
message += new String(buf, "UTF8");
Он не получает 40 байтов сообщения, отправленного клиентом, он получает 20 байтов и на втором socketServer.receive(packet)
зависает для нового сообщения.
Причина по определению:
Этот метод блокируется до получения дейтаграммы. Поле длины
объект пакета дейтаграммы содержит длину полученного
сообщение. Если сообщение длиннее, чем длина пакета,
сообщение обрезано.
Мне нужно иметь возможность прочитать 20 байтов сообщения и еще 20 байтов сообщения. Как этого достичь?
Мне это нужно, потому что я не уверен, как долго сообщение будет. Я хочу что-то вроде этого:
String message = "";
while (!message.contains("\r\n\r\n")) { //"\r\n\r\n" marks end of message
byte[] buf = new byte[20];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socketServer.receive(packet);
message += new String(buf, "UTF8");
}
Получается полное сообщение, если сообщение заканчивается на \r\n\r\n
.
Это нужно сделать по протоколу UDP
. Я новичок в сокетах в Java
, но я предполагаю, что есть что-то для этого, просто не могу найти это. Заранее спасибо.