Некоторым кажется NSStream как обрезать данные - PullRequest
0 голосов
/ 27 ноября 2011

Я тяну волосы за это. Я отправляю несколько частей данных на сервер, поэтому я помещаю их в буфер, а затем отправляю буфер. Все выглядит нормально, но на сервере строка обрезается в разных точках, поэтому, например, я получаю «1234567890123 \ 0 \ 0 \ 0 ...» вместо «12345678901234567890123456789012».

Все данные работают нормально и переносятся нормально. У кого-нибудь есть подсказка, почему целое сообщение не встретится. Сервер читает все сообщение из потока, ни один байт не остается непрочитанным, клиент отправляет 68, сервер получает 68 байтов. Может ли это быть кодировка?

Вот код iPhone:

int command = 0;
int msgLen =0;
int bytesSent;

(void)memcpy(_data, &command, sizeof(int)); msgLen++; 
(void)memcpy(_data+2, &playerID, sizeof(int)); msgLen++;

NSString *response  = [NSString stringWithString:@"12345678901234567890123456789012"];
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSUnicodeStringEncoding]];
(void)memcpy(_data+3, [data bytes], [data length]);
msgLen += [data length];

(void)memcpy(_data+1, &msgLen, sizeof(int)); msgLen++;

bytesSent = [outputStream write:(const uint8_t *)_data maxLength:msgLen];

NSLog(@"sent %d of %d",bytesSent, msgLen);

Вот код C #

    private void JoinServer(TcpClient client, byte[] buffer)
    {
        int offset = 0;
        int playerid = BitConverter.ToInt32(buffer, offset);
        offset += 4;
        var playerkey = Encoding.Unicode.GetString(buffer, offset, buffer.Length-4);
        System.Diagnostics.Debug.WriteLine(playerkey, "JoinPlayerReceived");

        try
        {

            GetSubscriberByClient(client).PlayerId = playerid;
            SendJoinServerStatus(playerid, playerid);
        }
        catch (Exception)
        {
            SendJoinServerStatus(playerid, 0);
        }

    }

1 Ответ

0 голосов
/ 15 марта 2012

Решение было в кодировке.

После того, как я исправил кодировку, и все работает нормально, все строки отображаются так, как они были отправлены с сервера, работают отлично.

...