Unity 6.3
0 онлайн 34 гостей 3 в системе
Вход

ChannelService

класс в UnityEditor.MPE

Описание

ChannelService инкапсулирует сервер WebSocket, работающий в Unity.

ChannelService позволяет вам создавать новые каналы связи. Канал соответствует маршруту URL, соединяющегося с ChannelService. Например, "127.0.0.1:9292/<channelName>"

ChannelService позволяет пользовательским обработчикам получать все сообщения на определенном канале.

Unity не запускает ChannelService автоматически. Вы должны запустить его вручную с помощью ChannelService.Start. Альтернативно, вы можете использовать следующий параметр командной строки: --ump-channel-service-on-startup.

using System;
using System.Text;
using UnityEditor.MPE;
using UnityEditor;
using UnityEngine;

public static class ChannelCommunicationDocExample { [MenuItem("ChannelDoc/Step 1")] static void StartChannelService() { if (!ChannelService.IsRunning()) { ChannelService.Start(); } Debug.Log($"[Step1] ChannelService Running: {ChannelService.GetAddress()}:{ChannelService.GetPort()}"); }

static int s_BinaryChannelId; static int s_StringChannelId; static Action s_DisconnectBinaryChannel; static Action s_DisconnectStringChannel;

[MenuItem("ChannelDoc/Step 2")] static void SetupChannelService() { if (s_DisconnectBinaryChannel == null) { s_DisconnectBinaryChannel = ChannelService.GetOrCreateChannel("custom_binary_ping_pong", HandleChannelBinaryMessage); s_BinaryChannelId = ChannelService.ChannelNameToId("custom_binary_ping_pong"); } Debug.Log($"[Step2] Setup channel_custom_binary id: {s_BinaryChannelId}");

if (s_DisconnectStringChannel == null) { s_DisconnectStringChannel = ChannelService.GetOrCreateChannel("custom_ascii_ping_pong", HandleChannelStringMessage); s_StringChannelId = ChannelService.ChannelNameToId("custom_ascii_ping_pong"); } Debug.Log($"[Step2] Setup channel_custom_ascii id: {s_StringChannelId}"); }

static void HandleChannelBinaryMessage(int connectionId, byte[] data) { var msg = ""; for (var i = 0; i < Math.Min(10, data.Length); ++i) { msg += data[i].ToString(); } Debug.Log($"Channel Handling binary from connection {connectionId} - {data.Length} bytes - {msg}");

// Client has sent a message (this is a ping) // Lets send back the same message (as a pong) ChannelService.Send(connectionId, data); }

static void HandleChannelStringMessage(int connectionId, byte[] data) { // Client has sent a message (this is a ping) // Client expects string data. Encode the data and send it back as a string:

var msgStr = Encoding.UTF8.GetString(data); Debug.Log($"Channel Handling string from connection {connectionId} - {msgStr}");

// Send back the same message (as a pong) ChannelService.Send(connectionId, msgStr); }

static ChannelClient s_BinaryClient; static Action s_DisconnectBinaryClient; static ChannelClient s_StringClient; static Action s_DisconnectStringClient; [MenuItem("ChannelDoc/Step 3")] static void SetupChannelClient() { const bool autoTick = true;

if (s_BinaryClient == null) { s_BinaryClient = ChannelClient.GetOrCreateClient("custom_binary_ping_pong"); s_BinaryClient.Start(autoTick); s_DisconnectBinaryClient = s_BinaryClient.RegisterMessageHandler(HandleClientBinaryMessage); } Debug.Log($"[Step3] Setup client for channel custom_binary_ping_pong. ClientId: {s_BinaryClient.clientId}");

if (s_StringClient == null) { s_StringClient = ChannelClient.GetOrCreateClient("custom_ascii_ping_pong"); s_StringClient.Start(autoTick); s_DisconnectStringClient = s_StringClient.RegisterMessageHandler(HandleClientStringMessage); } Debug.Log($"[Step3] Setup client for channel custom_ascii_ping_pong. ClientId: {s_StringClient.clientId}"); }

static void HandleClientBinaryMessage(byte[] data) { Debug.Log($"Receiving pong binary data: {data} for clientId: {s_BinaryClient.clientId} with channelName: {s_BinaryClient.channelName}"); }

static void HandleClientStringMessage(string data) { Debug.Log($"Receiving pong data: {data} for clientId: {s_StringClient.clientId} with channelName: {s_StringClient.channelName}"); }

[MenuItem("ChannelDoc/Step 4")] static void ClientSendMessageToServer() { Debug.Log("[Step 4]: Clients are sending data!"); s_BinaryClient.Send(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 }); s_StringClient.Send("Hello world!"); }

[MenuItem("ChannelDoc/Step 5")] static void CloseClients() { Debug.Log("[Step 5]: Closing clients"); s_DisconnectBinaryClient(); s_BinaryClient.Close();

s_DisconnectStringClient(); s_StringClient.Close(); }

[MenuItem("ChannelDoc/Step 6")] static void CloseService() { Debug.Log("[Step 6]: Closing clients");

s_DisconnectBinaryChannel(); s_DisconnectStringChannel();

ChannelService.Stop(); } }

/* When you execute the menu items one after the other, Unity prints the following messages to the Console window:

[Step1] ChannelService Running: 127.0.0.1:64647

[Step2] Setup channel_custom_binary id: -1698345965

[Step2] Setup channel_custom_ascii id: -930064725

[Step3] Setup client for channel custom_binary_ping_pong. ClientId: -1698345965

[Step3] Setup client for channel custom_ascii_ping_pong. ClientId: -930064725

[Step 4]: Clients are sending data!

Channel Handling binary from connection 1 - 8 bytes - 01234567

Channel Handling string from connection 2 - Hello world!

Receiving pong binary data: System.Byte[] for clientId: -1698345965 with channelName: custom_binary_ping_pong

Receiving pong data: Hello world! for clientId: -930064725 with channelName: custom_ascii_ping_pong

[Step 5]: Closing clients

[Step 6]: Closing clients

*/

Статические методы

Метод Описание
BroadcastОтправляет сообщение ко всем ChannelClient соединениям определенного канала.
BroadcastBinaryОтправляет сообщение ко всем ChannelClient соединениям определенного канала.
ChannelNameToIdЗакрывает определенный канал и все соединения к этому каналу.
CloseChannelЗакрывает определенный канал и все соединения к этому каналу.
DispatchMessagesОтправляет любые сообщения, полученные после последней отправки. Это происходит автоматически каждый раз, когда редактор отмечает, но этот метод может быть использован для принудительного отправления во время операций блокировки потока.
GetAddressПолучает адрес ChannelService. Это всегда локальный адрес, например, 127.0.0.1.
GetChannelClientListПолучает список всех клиентов канала, подключенных к ChannelService.
GetChannelListПолучает список каналов открытых в ChannelService. По умолчанию ChannelService всегда имеет канал "статус" и канал "события".
GetOrCreateChannelПолучение или создание нового канала.
GetPortПолучает порт, на котором работает ChannelService. Этот порт выбирается случайным образом при первом запуске ChannelService. Вы также можете указать порт из командной строки, используя параметр --ump-channel-service-port <portNumber>.
IsRunningПроверяет, работает ли ChannelService и прослушивает ли он новые соединения.
RegisterMessageHandlerРегистрация обработчика для обработки всех входящих сообщений на определенном канале.
SendОтправляет сообщение на определенное соединение. Сообщение может быть двоичным или UTF8.
StartЗапускает ChannelService. После запуска ChannelService он просматривает подключение на URL, предоставленном: <ChannelService Адрес>:<ChannelServicePort>/<channelName>, например, 127.0.0.1:9976/events. См. ChannelService.GetAddress и ChannnelService.GetPort.
StopПрекращает прослушивание ChannelService и закрывает все уже установленные соединения.
UnregisterMessageHandlerОтменяет регистрацию определенного обработчика из Канала.