2017-10-18 6 views
0

사용자가 이미지를 만든 다음 해당 이미지를 서버로 전송하여 이미지를 가져올 수있는 개발중인 컬러링 북 유형 응용 프로그램의 프로토 타입을 프로토 타입 화하려고합니다. 그것을 인스턴스화 된 메쉬 주위에 랩핑합니다. 이 반복의 초기 문제는 버퍼 크기입니다. 오류가 발생합니다 :NetworkWriter WriteBytes : 버퍼가 너무 크다

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); 
    } 
} 

클라이언트 측 코드 : 당신은 NetworkManager.connectionConfig 설정을 통해 사용자 정의 설정을 설정해야합니다

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"); 
    } 
} 

답변

1

더 큰 패킷 크기로 설정 한 ConnectionConfig 개체로 설정하십시오. 샘플 코드는 다음과 같이 시작해야합니다.

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

실제로 메시지를 보낼 때 사용할 채널 유형은 어디에 있습니까? – greyBow

+0

connectionConfig는 읽기 전용 속성입니다. 이 순간에 작동하지 않는 것 같습니다. – greyBow

+0

@greyBow 설명서에 읽기 전용이라고되어 ​​있지 않습니다. 나는 그것을 사용한 적이 없기 때문에 내가 가지고있는 것은 문서이다. – Draco18s