FunGame-Core/FunGame.Core/Service/SocketManager.cs
2022-11-19 01:51:49 +08:00

122 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Milimoe.FunGame.Core.Interface.Base;
using System.Collections;
using System.Net.Sockets;
using System.Net;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Api.Utility;
namespace Milimoe.FunGame.Core.Service
{
internal class SocketManager
{
internal static Socket? Socket { get; private set; } = null;
internal static Socket? Connect(string IP, int Port = 22222)
{
Socket? socket = null;
EndPoint ServerEndPoint;
try
{
socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerEndPoint = new IPEndPoint(IPAddress.Parse(IP), Port);
if (ServerEndPoint != null)
{
while (true)
{
if (!socket.Connected)
{
socket.Connect(ServerEndPoint);
if (socket.Connected)
{
SocketManager.Socket = socket;
return socket;
}
}
}
}
}
catch
{
socket?.Close();
}
return null;
}
internal static SocketResult Send(SocketMessageType type, string msg)
{
if (Socket != null)
{
if (Socket.Send(Core.Library.Constant.General.DEFAULT_ENCODING.GetBytes(MakeMessage(type, msg))) > 0)
{
return SocketResult.Success;
}
else return SocketResult.Fail;
}
return SocketResult.NotSent;
}
internal static string[] Receive()
{
string[] result = new string[2];
if (Socket != null)
{
// 从服务器接收消息
byte[] buffer = new byte[2048];
int length = Socket.Receive(buffer);
if (length > 0)
{
string msg = Core.Library.Constant.General.DEFAULT_ENCODING.GetString(buffer, 0, length);
result[0] = GetTypeString(GetType(msg));
result[1] = GetMessage(msg);
return result;
}
}
return result;
}
private static int GetType(string msg)
{
int index = msg.IndexOf(';') - 1;
if (index > 0)
return Convert.ToInt32(msg[..index]);
else
return Convert.ToInt32(msg[..1]);
}
private static string GetMessage(string msg)
{
int index = msg.IndexOf(';') + 1;
return msg[index..];
}
private static string MakeMessage(SocketMessageType type, string msg)
{
return (int)type + ";" + msg;
}
private static string GetTypeString(SocketMessageType type)
{
return type switch
{
SocketMessageType.GetNotice => SocketSet.GetNotice,
SocketMessageType.Login => SocketSet.Login,
SocketMessageType.CheckLogin => SocketSet.CheckLogin,
SocketMessageType.Logout => SocketSet.Logout,
SocketMessageType.Disconnect => SocketSet.Disconnect,
SocketMessageType.HeartBeat => SocketSet.HeartBeat,
_ => SocketSet.Unknown,
};
}
private static string GetTypeString(int type)
{
return GetTypeString((SocketMessageType)type);
}
}
}