2016-02-18 5 views
3

Итак, я пытаюсь отправить некоторые данные по сети, используя UDP в Unity 5.3. Поскольку пакеты могут быть слишком большими для отправки сразу, я попытался разбить их на более мелкие. (Примечание: Эти пакеты получают отправить в 30 раз в секунду, поэтому потеря определенного пакета действительно не имеет значения)Не удалось прочитать прошлый конец потока

То, что я в основном сделал:

  1. Создание массива байт
  2. Split в разные , меньше, массивы байт
  3. Добавить массив байт в сериализованный класс с другой информацией
  4. Преобразования сериализованного класса в массив байт
  5. Send, и наоборот, на принимающем клиенте

При попытке десериализовать полученный массив байтов я получаю сообщение об ошибке «Не удалось прочитать прошлый конец потока».

Вот код Deserialize:

private static object ToObject(byte[] data) 
{ 
    var formatter = new BinaryFormatter(); 
    using (var stream = new MemoryStream(data)) 
    { 
     stream.Seek(0, SeekOrigin.Begin); 
     return formatter.Deserialize(stream); // exception thrown here 
    } 
} 

сериализовать:

private static byte[] ToByteArray(object source) 
{ 
    var formatter = new BinaryFormatter(); 
    using (var stream = new MemoryStream()) 
    { 
     formatter.Serialize(stream, source);     
     return stream.ToArray(); 
    } 
} 

Класс:

[System.Serializable] 
public class Chunk 
{ 
    public short ID {get; set;} 
    public short ChunkAmount {get; set;} 
    public System.Int64 FrameID {get; set;} 
    public byte[] ChunkData {get; set;} 
} 

Любая идея, что может привести к этому исключению?

Вы могли бы сэкономить мне парик, поняв это. Так что спасибо заранее!

EDIT:

Предоставленные функции, которые обрабатывают сериализации:

public static List<byte[]> GetChunks(List<byte> bytes, int maxChunkSize, System.Int64 frameID) 
{ 
    var list = new List<byte[]>(); 

    for (int i=0; i < bytes.Count; i+= maxChunkSize) 
    { 
     list.Add(bytes.GetRange(i, Mathf.Min(maxChunkSize, bytes.Count - i)).ToArray()); 
    } 

    List<byte[]> serializedChunks = new List<byte[]>(); 
    for(int i = 0; i < list.Count; i++) 
    { 
     Chunk c = new Chunk(); 
     c.ID = (short)i; 
     c.ChunkData = list[i].ToArray(); 
     c.ChunkAmount = (short)list.Count; 
     c.FrameID = frameID; 

     serializedChunks.Add(ToByteArray(c)); 
    } 

    return serializedChunks; 
} 

//Deserialized a chunk from byte array 
public static Chunk AssembleSingleChunk(byte[] serializedChunk) 
{ 
    return (Chunk)ToObject(serializedChunk); 
} 

public static byte[] AssembleChunks(List<Chunk> chunks) 
{ 
    List<Chunk> chunkList = new List<Chunk>(chunks); 
    List<Chunk> sortedChunkList = chunkList.OrderBy(c => c.ID).ToList(); 

    List<byte> allBytes = new List<byte>(); 
    for (int i = 0; i < sortedChunkList.Count; i++) 
    { 
     allBytes.AddRange(sortedChunkList[i].ChunkData); 
    } 

    return allBytes.ToArray(); 
} 
+0

Если 'data' из' ToObject' были точно такими же отправленными байтами, вы не получили бы эту ошибку. Но трудно догадаться об ошибке с кодом, который вы указали ... – Eser

+0

Я получаю это, но он держит меня за исключение для каждого полученного пакета. Я обновляю вопрос с помощью кода, где я собираю сериализованный класс –

ответ

0

Нашли его ...

Это не имеет ничего общего с указанным кодом, но с буфером получающего клиента. Я установил буфер на 1024 байта, а отправляемые пакеты были выше этого размера.

Итак, 2 обходные пути:

  1. увеличить размер буфера
  2. буфер чтения, хранить данные, очистить буфер, считывать данные, добавлять данные, и т.д .. (Не тестировался, просто предполагая)

Не стесняйтесь, уточняйте у нас больше информации!

 Смежные вопросы

  • Нет связанных вопросов^_^