Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NetworkWriter WriteBytes:缓冲区太大_C#_Unity3d_Networking_Buffer - Fatal编程技术网

C# NetworkWriter WriteBytes:缓冲区太大

C# NetworkWriter WriteBytes:缓冲区太大,c#,unity3d,networking,buffer,C#,Unity3d,Networking,Buffer,我正在尝试为我正在开发的一个配色书类型的应用程序设计一个网络原型,该应用程序允许用户创建一个图像,然后将该图像发送到服务器,然后服务器获取图像并将其环绕在一个实例化的网格上。我在这个迭代中的最初问题是缓冲区大小。我得到了一个错误: NetworkWriter WriteBytes: buffer is too large (699064) bytes. The maximum buffer size is 64K bytes. UnityEngine.Networking.NetworkWrit

我正在尝试为我正在开发的一个配色书类型的应用程序设计一个网络原型,该应用程序允许用户创建一个图像,然后将该图像发送到服务器,然后服务器获取图像并将其环绕在一个实例化的网格上。我在这个迭代中的最初问题是缓冲区大小。我得到了一个错误:

NetworkWriter WriteBytes: buffer is too large (699064) bytes. The maximum buffer size is 64K bytes.
UnityEngine.Networking.NetworkWriter:WriteBytesFull(Byte[])
TextureMessage:Serialize(NetworkWriter)
UnityEngine.Networking.NetworkServer:SendToAll(Int16, MessageBase)
Server:SendTexture(Texture2D, String) (at Assets/Scripts/Server.cs:32)
Server:SendOnButtonPress() (at Assets/Scripts/Server.cs:19)
UnityEngine.EventSystems.EventSystem:Update()
如何增加缓冲区大小?我的图像将在1.5-2mb范围内。我的代码如下:

public class MyMsgType
{
    public static short texture = MsgType.Highest + 1;
}

public class TextureMessage : MessageBase
{
    public byte[] textureBytes;
    public string message; //Optional
}
服务器端代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class Server : MonoBehaviour {

    public Texture2D textureToSend;
    string messageToSend = "Test Message";

    // Use this for initialization
    void Start () {
        NetworkManager.singleton.StartHost();
        Debug.Log("Server Started.");
    }

    public void SendOnButtonPress()
    {
        SendTexture(textureToSend, messageToSend);
    }

    //Call to send the Texture and a simple string message
    public void SendTexture(Texture2D texture, string message)
    {
        TextureMessage msg = new TextureMessage();

        //Convert Texture2D to byte array

        msg.textureBytes = texture.GetRawTextureData();
        msg.message = message;

        NetworkServer.SendToAll(MyMsgType.texture, msg);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class Client : MonoBehaviour
{
    NetworkClient myClient;

    // Use this for initialization
    void Start () {
        NetworkManager.singleton.StartClient();
        Debug.Log("Client Started.");

        setupClient();
    }

    // Create a client and connect to the server port
    public void setupClient()
    {
        //Create new client
        myClient = new NetworkClient();
        //Register to connect event
        myClient.RegisterHandler(MsgType.Connect, OnConnected);
        //Register to texture receive event
        myClient.RegisterHandler(MyMsgType.texture, OnTextureReceive);

        //Connect to server
        myClient.Connect("127.0.0.1", 4444);
    }

    //Called when texture is received
    public void OnTextureReceive(NetworkMessage netMsg)
    {
        TextureMessage msg = netMsg.ReadMessage<TextureMessage>();

        //Your Received message
        string message = msg.message;
        Debug.Log("Texture Messsage " + message);

        //Your Received Texture2D
        Texture2D receivedtexture = new Texture2D(4, 4);
        receivedtexture.LoadRawTextureData(msg.textureBytes);
        receivedtexture.Apply();
    }

    public void OnConnected(NetworkMessage netMsg)
    {
        Debug.Log("Connected to server");
    }
}
客户端代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class Server : MonoBehaviour {

    public Texture2D textureToSend;
    string messageToSend = "Test Message";

    // Use this for initialization
    void Start () {
        NetworkManager.singleton.StartHost();
        Debug.Log("Server Started.");
    }

    public void SendOnButtonPress()
    {
        SendTexture(textureToSend, messageToSend);
    }

    //Call to send the Texture and a simple string message
    public void SendTexture(Texture2D texture, string message)
    {
        TextureMessage msg = new TextureMessage();

        //Convert Texture2D to byte array

        msg.textureBytes = texture.GetRawTextureData();
        msg.message = message;

        NetworkServer.SendToAll(MyMsgType.texture, msg);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class Client : MonoBehaviour
{
    NetworkClient myClient;

    // Use this for initialization
    void Start () {
        NetworkManager.singleton.StartClient();
        Debug.Log("Client Started.");

        setupClient();
    }

    // Create a client and connect to the server port
    public void setupClient()
    {
        //Create new client
        myClient = new NetworkClient();
        //Register to connect event
        myClient.RegisterHandler(MsgType.Connect, OnConnected);
        //Register to texture receive event
        myClient.RegisterHandler(MyMsgType.texture, OnTextureReceive);

        //Connect to server
        myClient.Connect("127.0.0.1", 4444);
    }

    //Called when texture is received
    public void OnTextureReceive(NetworkMessage netMsg)
    {
        TextureMessage msg = netMsg.ReadMessage<TextureMessage>();

        //Your Received message
        string message = msg.message;
        Debug.Log("Texture Messsage " + message);

        //Your Received Texture2D
        Texture2D receivedtexture = new Texture2D(4, 4);
        receivedtexture.LoadRawTextureData(msg.textureBytes);
        receivedtexture.Apply();
    }

    public void OnConnected(NetworkMessage netMsg)
    {
        Debug.Log("Connected to server");
    }
}

您需要通过设置一个对象来设置自定义配置,该对象已设置为具有更大的数据包大小。示例代码应该可以帮助您开始:

void Start()
{
    ConnectionConfig myConfig = new ConnectionConfig();
    myConfig.AddChannel(QosType.Unreliable);
    myConfig.AddChannel(QosType.UnreliableFragmented);
    myConfig.PacketSize = 1440;
    NetworkManager.connectionConfig = myConfig;
}

当我实际发送消息时,在哪里说要使用哪种通道类型?connectionConfig是只读属性。这在目前似乎不起作用。@greyBow文档并没有说它是只读的。我从未使用过它,所以我只有文档。我得到的错误是:Assets/Scripts/Server.cs31,10:error CS0200:Property或indexer UnityEngine.Networking.NetworkManager.connectionConfig“无法分配给它的是只读的”@greyBow您使用的是哪个版本的Unity?