168 lines
4.4 KiB
C#
168 lines
4.4 KiB
C#
using System;
|
|
using Cysharp.Threading.Tasks;
|
|
using ShrinkNetwork;
|
|
using UnityEngine;
|
|
|
|
public enum ShrinkNetworkExampleTransportKind
|
|
{
|
|
Tcp = 0,
|
|
Kcp = 1
|
|
}
|
|
|
|
[AddComponentMenu("ShrinkSDK/Shrink Network Ping Client Example")]
|
|
[DisallowMultipleComponent]
|
|
public sealed class ShrinkNetworkPingClientExample : MonoBehaviour
|
|
{
|
|
[SerializeField] private ShrinkNetworkExampleTransportKind transportKind = ShrinkNetworkExampleTransportKind.Tcp;
|
|
[SerializeField] private string host = "127.0.0.1";
|
|
[SerializeField] private int port = 17001;
|
|
[SerializeField] private bool connectOnStart = true;
|
|
[SerializeField] private bool sendPingOnConnected = true;
|
|
[SerializeField] private string pingText = "unity";
|
|
|
|
private ShrinkNetworkService _service;
|
|
private IShrinkNetworkTransport _transport;
|
|
private ShrinkNetworkSession _session;
|
|
private bool _isSending;
|
|
|
|
private void Reset()
|
|
{
|
|
host = "127.0.0.1";
|
|
port = transportKind == ShrinkNetworkExampleTransportKind.Kcp ? 17002 : 17001;
|
|
connectOnStart = true;
|
|
sendPingOnConnected = true;
|
|
pingText = "unity";
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
if (connectOnStart)
|
|
Connect();
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
Disconnect();
|
|
}
|
|
|
|
private void OnValidate()
|
|
{
|
|
if (port < 1)
|
|
port = 1;
|
|
else if (port > 65535)
|
|
port = 65535;
|
|
}
|
|
|
|
[ContextMenu("Connect")]
|
|
public void Connect()
|
|
{
|
|
Disconnect();
|
|
|
|
_service = new ShrinkNetworkService(
|
|
new ShrinkMessagePackNetworkSerializer(),
|
|
new ShrinkNetworkMessageRegistry(),
|
|
new ShrinkNetworkRouter());
|
|
_service.AutoRegisterAttributedMessages();
|
|
_service.OnSessionConnected += HandleSessionConnected;
|
|
_service.OnSessionDisconnected += HandleSessionDisconnected;
|
|
|
|
_transport = CreateTransport();
|
|
_service.BindTransport(_transport);
|
|
|
|
Debug.Log($"[ShrinkNetworkExample] Connecting to {transportKind} {host}:{port}");
|
|
}
|
|
|
|
[ContextMenu("Disconnect")]
|
|
public void Disconnect()
|
|
{
|
|
if (_service != null)
|
|
{
|
|
_service.OnSessionConnected -= HandleSessionConnected;
|
|
_service.OnSessionDisconnected -= HandleSessionDisconnected;
|
|
}
|
|
|
|
_transport?.Stop();
|
|
_transport = null;
|
|
_service = null;
|
|
_session = null;
|
|
_isSending = false;
|
|
}
|
|
|
|
[ContextMenu("Send Ping")]
|
|
public void SendPing()
|
|
{
|
|
SendPingAsync().Forget();
|
|
}
|
|
|
|
public async UniTask SendPingAsync()
|
|
{
|
|
if (_session == null)
|
|
{
|
|
Debug.LogWarning("[ShrinkNetworkExample] No active session. Connect first.");
|
|
return;
|
|
}
|
|
|
|
if (_isSending)
|
|
return;
|
|
|
|
_isSending = true;
|
|
try
|
|
{
|
|
var response = await _session.RpcAsync<PingRequest, PingResponse>(new PingRequest
|
|
{
|
|
Text = pingText
|
|
});
|
|
Debug.Log($"[ShrinkNetworkExample] Ping reply: {response.Reply}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.LogException(ex, this);
|
|
}
|
|
finally
|
|
{
|
|
_isSending = false;
|
|
}
|
|
}
|
|
|
|
private IShrinkNetworkTransport CreateTransport()
|
|
{
|
|
return transportKind == ShrinkNetworkExampleTransportKind.Kcp
|
|
? new ShrinkKcpClientTransport(host, port, new ShrinkKcpTransportOptions
|
|
{
|
|
Interval = 10,
|
|
UpdateIntervalMs = 10,
|
|
IdleTimeoutMs = 20000
|
|
})
|
|
: new ShrinkTcpClientTransport(host, port);
|
|
}
|
|
|
|
private void HandleSessionConnected(ShrinkNetworkSession session)
|
|
{
|
|
_session = session;
|
|
Debug.Log($"[ShrinkNetworkExample] Connected: {session.RemoteAddress}");
|
|
|
|
if (sendPingOnConnected)
|
|
SendPingAsync().Forget();
|
|
}
|
|
|
|
private void HandleSessionDisconnected(ShrinkNetworkSession session)
|
|
{
|
|
if (_session == session)
|
|
_session = null;
|
|
|
|
Debug.Log($"[ShrinkNetworkExample] Disconnected: {session.RemoteAddress}");
|
|
}
|
|
}
|
|
|
|
[ShrinkNetworkMessage(1001, "auth/ping")]
|
|
public sealed class PingRequest : IShrinkNetworkRequest
|
|
{
|
|
public string Text { get; set; } = "";
|
|
}
|
|
|
|
[ShrinkNetworkMessage(1002, "auth/ping_response")]
|
|
public sealed class PingResponse : ShrinkRpcResponseBase
|
|
{
|
|
public string Reply { get; set; } = "";
|
|
}
|