Вызов Socket.send за короткое время приводит к отправке двух разных данных в одном пакете. - PullRequest
0 голосов
/ 19 мая 2011

Я программирую игру, которая отправляет позицию игрока на сервер при каждом перемещении игрока, используя XML следующим образом:

<?xml version="1.0" encoding="utf-8" ?> <request type="movement"> <character map="1" coords="10,20"/> </request>

Дело в том, что, поскольку информация отправляется очень быстро, она обычно отправляет два или три раза XML в одном и том же пакете, а затем сервер не может правильно ее проанализировать.

На стороне клиента, используя C # .net, я создаю новый Task, чтобы отправить информацию, чтобы она продолжала корректно обновлять игру, в задаче, которую я просто вызываю Socket.send, чтобы отправить XML в виде текста строка.

Клиент:

Byte[] bytesToSend = Encoding.ASCII.GetBytes(texto);
socket.Send(bytesToSend, bytesToSend.length, 0);

Java-сервер:

public String convertStreamToString(InputStream is) throws Exception {
        BufferedInputStream reader = new BufferedInputStream(is);
        byte[] ent = null;
        int recivido;
        // String line = reader.readLine();
        do {
            ent = new byte[reader.available()];


            recivido = reader.read(ent);
        } while (recivido == 0);

        return new String(ent);
    }

1 Ответ

1 голос
/ 19 мая 2011

TCP работает так, поскольку он основан на потоке, а не на сообщениях.

Прочитайте мой ответ здесь: Приложение останавливается при получении информации через сокет

Сторона клиента:

var buffer = Encoding.UTF8.GetBytes(yourXml);
var header = BitConverter.GetBytes(buffer.Length);
socket.Send(header);
socket.Send(buffer);

Сторона сервера:

var header = new byte[4];
var received = socket.Receive(header, 0, 4);
var xmlBuffer = new byte[BitConverter.ToInt32(header)];
socket.Receive(xmlBuffer, 0, xmlBuffer.Length);

Обратите внимание, что вы должны продолжать получать, пока вы действительно не получите 4 байта, а затем количество байтов, полученных в заголовке длины.(Я не делал этого в моем примере)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...