实测Windows和安卓上可运行
cs
using Byter;
using Netly;
using System.Collections.Generic;
using System.Net;
using UnityEngine;
using UnityEngine.UI;
public class NetlyTest : MonoBehaviour
{
public Text textPrompt;
public Text textClientCount;
TCP.Server server;
void Start()
{
server = new TCP.Server(isFraming: false);
server.On.Open(() =>
{
Log($"Server started at: {server.Host}");
});
server.On.Close(() =>
{
Log($"Server stopped at: {server.Host}");
});
server.On.Error((exception) =>
{
Log($"Error: {exception}");
});
server.On.Accept((client) =>
{
// scope reserved to each client
// each client have on scope like this.
// it mean each client will have own instance of eventData and rawData
List<(string message, byte[] data)> eventData = new();
List<byte[]> rawData = new();
Log("Client connected");
client.On.Open(() =>
{
});
client.On.Close(() =>
{
// client closed;
Log($"Client {client.Host} disconnected");
// clean all data received by this client
rawData.Clear();
eventData.Clear();
});
client.On.Data((bytes) =>
{
Log($"Client data ({client.Host}): {bytes.GetString()}");
//给所有终端发送消息
//server.To.DataBroadcast(bytes); // broadcast data
//给单个终端发消息
client.To.Data($"server send:{bytes.GetString()}");
// save history of data
rawData.Add(bytes);
});
client.On.Event((name, bytes) =>
{
Log($"Client event ({name}): ({client.Host}): {bytes.GetString()}");
server.To.EventBroadcast(name, bytes); // broadcast event
// save history of events
eventData.Add((name, bytes));
});
});
server.To.Open(new Host(IPAddress.Any, 8080));
}
// Update is called once per frame
void Update()
{
if (Time.frameCount % 5 == 0)
{
textClientCount.text = ($"server.Clients.Length = {server.Clients.Length}");
}
}
private void OnDisable()
{
server.To.Close();
}
void Log(string text)
{
textPrompt.text = text;
Debug.Log(text);
}
}