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();
}
}
}