A ChannelClient is created on a specific channel. A channel name matches the last part of a WebSocket URL. For example: 127.0.0.1:9090/<channelName>.
The EventService is a ChannelClient connected to the "events" channel.
You can create custom channels using the ChannelService, and connect to them using a ChannelClient. For information about creating channels, see 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
*/