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. |