Описание
ChannelClient — это клиент WebSocket, который подключается к ChannelService Unity, который является сервером WebSocket.
ChannelClient создается для определенного канала. Имя канала соответствует последней части URL-адреса WebSocket. Например: 127.0.0.1:9090/
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
*/
Свойства
название канала | Имя канала, к которому подключен этот ChannelClient. Имя соответствует маршруту URL-адреса, используемого для подключения к ChannelService Unity. Например, 127.0.0.1:8928/<имя моего канала>. |
clientId | Идентификатор канала, который по сути является хэшем имени канала. См. ChannelService.ChannelNameToId. |
isAutoTick | Указывает, обрабатывает ли Unity (отмечает) входящие и исходящие сообщения этого ChannelClient автоматически или пользователь обрабатывает (отмечает) их вручную либо в основном потоке, либо в выделенном потоке. |
Публичные Методы
Close | Закрывает ChannelClient. Это закрывает клиент WebSocket, но не канал в ChannelService. Другие ChannelClients могут по-прежнему подключаться к тому же каналу. |
GetChannelClientInfo | Получает ChannelClientInfo для определенного канала. |
IsConnected | Проверяет, подключен ли ChannelClient к ChannelService. |
NewRequestId | Создает уникальный идентификатор запроса для этого ChannelClient в этом экземпляре Unity. Дополнительные сведения о запросах см. в разделе ChannelClient.Request. |
RegisterMessageHandler | Регистрирует новый обработчик на определенном канале. Новый обработчик вызывается всякий раз, когда сообщение отправляется ChannelClient. |
Send | Отправляет ASCII или двоичное сообщение в ChannelService. В зависимости от того, как обработчик канала обрабатывает сообщение, оно также может быть отправлено другим соединениям. |
Start | Запускает существующий ChannelClient, чтобы он прослушивал входящие и исходящие сообщения. |
Stop | Не позволяет конкретному ChannelClient прослушивать новые сообщения. Это отличается от ChannelClient.Close, поскольку вы можете перезапустить клиент канала с помощью ChannelClient.Start. |
Tick | Отмечает ChannelClient. Когда вы вызываете этот метод, он проверяет, нужно ли обрабатывать какие-либо входящие сообщения с сервера и нужно ли отправлять какие-либо исходящие сообщения на сервер. |
UnregisterMessageHandler | Отменяет регистрацию определенного обработчика канала в ChannelClient. |
Статические Методы
GetChannelClientList | Получает информацию для всех ChannelClient, работающих на одном экземпляре Unity. |
GetOrCreateClient | Создает новый ChannelClient для определенного канала. Если клиент уже существует, этот метод получает клиента. |
Shutdown | Закрывает все ChannelClients в этом экземпляре Unity. |