Qos тип ReliableFragmented channel, не будет фрагментировать наш поток - PullRequest
0 голосов
/ 30 октября 2019

Мы пытаемся отправить изображение с сервера клиенту по надежному фрагментированному каналу в UNET. Мы получаем ошибку, если превышаем размер буфера (макс. ~ 64000 байт). Мы забыли определить какие-либо атрибуты для фрагментированного канала или он должен быть фрагментирован сам по себе?

Мы используем Unity 2018.4 Мы попытались сделать размер буфера «динамическим», определив его как длинусериализованное сообщение. А на стороне клиента у нас размер буфера 64000. У нас сложилось впечатление, что фрагментация не происходит автоматически.

Вот некоторые соответствующие фрагменты из нашего кода:

Сторона сервера(отправитель)

    NetworkTransport.Init();

        ConnectionConfig cc = new ConnectionConfig();
        reliableChannel = cc.AddChannel(QosType.Reliable); 
        reliableFragmentedChannel = cc.AddChannel(QosType.ReliableFragmented); //here we add the reliable fragmented channel

        HostTopology topo = new HostTopology(cc, MAX_USER);

//This function should send fragmented messages.
public void SendClientFragmented(int recHost, int connectionId, NetMsg msg)
    {
        // This is where we hold our data
        //byte[] buffer = new byte[BYTE_SIZE];

        // This is where you would crush your data into a byte[]
        BinaryFormatter formatter = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();
        formatter.Serialize(ms, msg);

        byte [] serializedStructure = ms.ToArray();
        Debug.Log("Structure Length:" + serializedStructure.Length);
        //if (recHost == 0)
        NetworkTransport.Send(hostId, connectionId, reliableFragmentedChannel, serializedStructure, serializedStructure.Length, out error);

//Our function to send the image (the Arrays are in case of multiple clients logged in). This function is called in the next section
    public void SendImageToClient(byte[] byteTexture)
    {
        int[] recHostIdArray = recHostIdList.ToArray();
        int[] connectionIdArray = connectionIdList.ToArray();
        int[] channelIdArray = channelIdList.ToArray();

        Net_SendImage im = new Net_SendImage();

        im.imageByte = byteTexture;

        SendClientFragmented(recHostIdArray[0], connectionIdArray[0], im);
    }

//Here we transform the image to a byte array
    public void OnClickSendImage()
    {
        Texture2D image = (Texture2D)GameObject.Find("PhotoDisplay").GetComponent<Renderer>().material.mainTexture;

        byte[] jpgBytes = image.EncodeToJPG(10);      //Vielleicht Länge des byte arrays mitsenden.

        Debug.Log("Byte Array created");
        Server.Instance.SendImageToClient(jpgBytes);
    }

Вот код на стороне клиента для получения байтового массива:


private const int BYTE_SIZE = 64000; 

//Reliable Fragmented channel definition
NetworkTransport.Init();

        ConnectionConfig cc = new ConnectionConfig();
        reliableChannel = cc.AddChannel(QosType.Reliable);
        reliableFragmentedChannel = cc.AddChannel(QosType.ReliableFragmented);

        HostTopology topo = new HostTopology(cc, MAX_USER);

//Receiving messages
NetworkEventType type = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, BYTE_SIZE, out dataSize, out error);
        switch (type)
        {
            case NetworkEventType.Nothing:
                break;

            case NetworkEventType.ConnectEvent:
                Debug.Log("We have connected to the Server");
                break;

            case NetworkEventType.DisconnectEvent:
                Debug.Log("We have been disconnected!");
                break;

            case NetworkEventType.DataEvent:
                BinaryFormatter formatter = new BinaryFormatter();
                MemoryStream ms = new MemoryStream(recBuffer, 0, dataSize);
                ms.Seek(0, SeekOrigin.Begin);
                //ms.Write(recBuffer, 0, recBuffer.Length);
                Debug.Log("Datasize: " + dataSize);
                NetMsg msg = (NetMsg)formatter.Deserialize(ms);

                OnData(connectionId, channelId, recHostId, msg);
                break;

            default:
            case NetworkEventType.BroadcastEvent:
                Debug.Log("Unexpected network event type");
                break;
        }

Мы ожидаем, что наш байт-массив изображений будет автоматически фрагментирован и отправлен клиенту. Что мы должны добавить или у нас плохой подход?

Спасибо за любую помощь!

...