using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using Stary.Evo; using UnityEngine; namespace Main { public interface IClientSocketSystem : ISystem { /// /// 连接 /// void OnConnect(string ip); /// /// 向服务端发送消息 /// /// 消息类型 /// 消息内容 void Send(SocketEvent type, string message); /// /// 断开连接 /// void DisConnect(); } public class ClientSocketSystem : AbstractSystem, IClientSocketSystem { private SocketClient _socketClient; public override void Dispose() { // 注意由于Unity编译器环境下,游戏开启/关闭只影响主线程的开关,游戏关闭回调时需要通过Close函数来关闭服务端/客户端的线程。 if (_socketClient != null) _socketClient.Close(); } /// /// 向服务端发送消息 /// /// 消息类型 /// 消息内容 public void Send(SocketEvent type, string message) { var bytes = Encoding.UTF8.GetBytes(message); _socketClient.Send((ushort)type, bytes); } /// /// 退出服务端 /// public void DisConnect() { // 踢出连接 _socketClient.DisConnect(); } public void OnConnect(string ip) { _socketClient = new SocketClient(ip, 10000); _socketClient.Connect(() => { Debug.Log("连接成功"); _socketClient.OnReceive += OnReceive; // _client.DisConnect(); }, () => { Debug.Log("连接失败"); }); } public void Connect() { } protected override void OnInit() { } /// /// 接收客户端消息 /// /// 指定客户端 /// 消息数据 private void OnReceive(SocketDataPack data) { Debug.LogFormat("接收到数据>>>{0} {1}", (SocketEvent)data.Type, data.Buff.Length); switch ((SocketEvent)data.Type) { case SocketEvent.ServerMessage: Debug.LogFormat("接收到服务器数据 >>> {0}", Encoding.UTF8.GetString(data.Data)); var message = Encoding.UTF8.GetString(data.Data); break; case SocketEvent.ClientDisconn: break; } } public string GetLocalIPv4() { return Dns.GetHostEntry(Dns.GetHostName()) .AddressList.First(f => f.AddressFamily == AddressFamily.InterNetwork) .ToString(); } } }