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

ChannelClient

класс в UnityEditor.MPE

Описание

ChannelClient является клиентом WebSocket, который подключается к ChannelServiceUnity, который является сервером WebSocket.

ChannelClient создаётся для определённого канала. Имя канала соответствует последней части URL-адреса WebSocket. Например: 127.0.0.1:9090/<channelName>.

Объект EventService — это ChannelClient, подключённый к каналу "events".

Пользовательские каналы можно создавать с помощью ChannelService и подключаться к ним с помощью ChannelClient. Сведения о создании каналов см. в разделе ChannelService.GetOrCreateChannel.

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) { // A new message is received. // Since our clients 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}");

// Client has sent a message (this is a ping) // Lets 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

*/

Свойства

Свойство Описание
channelNameИмя канала, к которому подключён этот ChannelClient. Имя совпадает с маршрутом URL, используемого для подключения к ChannelService Unity. Например: 127.0.0.1:8928/<my Channel Name>.
clientIdКанал ID, который по сути хеш имена канала. См. ChannelService.ChannelNameToId.
isAutoTickУказывает, обрабатывает ли Unity входящие и исходящие сообщения ChannelClient автоматически, или пользователь обрабатывает их вручную, либо в основном потоке, либо в выделенной потоке.

Открытые методы

Метод Описание
CloseЗакрывает ChannelClient. Это закрывает WebSocket клиента, но не Канал в ChannelService. Другие ChannelClients могут все еще соединяться на том же Канале.
GetChannelClientInfoПолучает ChannelClientInfo для определенного канала.
IsConnectedПроверяет, подключен ли ChannelClient к ChannelService.
NewRequestIdСоздает уникальный запрос ID для этого ChannelClient в этом экземпляре Unity. Дополнительные сведения о запросах см. в ChannelClient.Request.
RegisterMessageHandlerРегистрирует новый handler на определенном канале. Новый handler вызывается всякий раз, когда сообщение отправляется на ChannelClient.
SendОтправляет ASCII или двоичное сообщение на ChannelService. В зависимости от того, как обработчик канала обрабатывает сообщение, оно может также быть отправлено на другие соединения.
StartЗапускает существующую ChannelClient, чтобы она прослушивала входящие и исходящие сообщения.
StopОстанавливает определенный ChannelClient от прослушивания новых сообщений. Это отличается от ChannelClient.Close, потому что Вы можете перезапустить клиент канала, используя ChannelClient.Start.
TickОтметка ChannelClient. При вызове этого метода проверяется, нужно ли обрабатывать какие-либо входящие сообщения с сервера, и нужно ли отправлять на сервер какие-либо исходящие сообщения.
UnregisterMessageHandlerОтрегистрирует определенный обработчик канала из ChannelClient.

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

Метод Описание
GetChannelClientListПолучает информацию для всех ChannelClients, запущенных на одном экземпляре Unity.
GetOrCreateClientСоздает новый ChannelClient на определенном канале. Если клиент уже существует, этот метод получает клиента.
ShutdownЗакрывает все ChannelClients в этом экземпляре Unity.