상세 해설 - 스트리밍 바이트

네트워크 상으로 전달할 필요가 있는 대규모 데이터 및/또는 데이터의 유형이 Bolt 속성(이미지, 딕셔너리와 같은)들로 전송되지 못할 때, 스트리밍은 쓸모가 없습니다.

먼저 초당 스트림 할 수 있는 최대 데이터 크기를 설정할 필요가 있습니다.

public override void Connected(BoltConnection connection) {
  connection.SetStreamBandwidth(1024 * 20);
}

서버 콜백을 둘 때 새로운 연결의 초기 스트림 대역폭을 20 kb/s 로 구성합니다.

그리고나서 바이너리 스트리밍 채널을 클라이언트와 호스트에 생성하기를 원할 것 입니다.

 public static UdpKit.UdpChannelName Voice;
 public static UdpKit.UdpChannelName CustomPlayerIcon;

    public override void BoltStartBegin()
    {
        Voice = BoltNetwork.CreateStreamChannel("Voice", UdpKit.UdpChannelMode.Unreliable, 1});
          CustomPlayerIcon = BoltNetwork.CreateStreamChannel("CustomPlayerIcon", UdpKit.UdpChannelMode.Reliable, 4});
    }

첫 번째 파라미터 이름은 채널이고, 두 번째는 채널을 신뢰 또는 비신뢰로 만들며 세 번째 파라미터는 우선순위를 표시합니다.

그리고나서 이 연결로 데이터의 바이너리 스트림을 전송할 수 있습니다. 아래는 Channels 클래스 내부에서 생성된 "PlayerIcon" 채널로 정적 레퍼런스를 이용하여 사용자정의 아이콘 텍스쳐의 바이너리 데이터를 서버로 전송하는 예제 입니다.

void SendCustomIcon(Texture2D myCustomIcon) {
  byte[] data = myCustomIcon.EncodeToPNG();

  //Streaming bytes in stream channel created in script "Channels"
  BoltNetwork.server.StreamBytes(Channels.PlayerIcon, data);
}

Then you will need a callback for when the binary stream data is received.

public override void StreamDataReceived(BoltConnection connnection, UdpStreamData data) {
  Texture2D icon = new Texture2D(4, 4);
  icon.LoadImage(data.Data);

  PlayerData playerData = (PlayerData)connection.userToken;
  playerData.SetIcon(icon);
}

그리고나서 수신 후에 원하는 데이터에 대해서 어떤 것이라도 할 수 있을 것 입니다. 이제 간단한 예제를 만들기 위하여 이 단계들을 합쳐 보겠습니다.

using UnityEngine;
using System.Collections;
using System.Text;
using UdpKit;
using Bolt;

[BoltGlobalBehaviour()]
public class StreamCallbacks : Bolt.GlobalEventListener
{
    public static UdpKit.UdpChannelName testChannel;


    public override void BoltStartBegin()
    {
        testChannel = BoltNetwork.CreateStreamChannel("test", UdpKit.UdpChannelMode.Reliable, 1);
    }


    public override void SceneLoadRemoteDone(BoltConnection c)
    {
        if (BoltNetwork.isServer)
        {
            byte[] data = Encoding.ASCII.GetBytes("Testing");
            c.StreamBytes(testChannel, data);
        }
    }

    public override void StreamDataReceived(BoltConnection connection, UdpStreamData data)
    {
        BoltLog.Info(data);
    }

}

할 수 있는 양이 제한되어 있기 때문에, 스트림 데이터양에 대해서 주의 해주세요.

기술문서 TOP으로 돌아가기