FunGame-Server/Sockets/ClientSocket.cs
2022-08-26 00:22:56 +08:00

138 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using FunGameServer.Models.Config;
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlTypes;
namespace FunGameServer.Sockets
{
public class ClientSocket
{
public bool Running { get; set; } = false;
public Socket? Socket { get; set; } = null;
public ClientSocket(Socket socket, bool running)
{
Socket = socket;
Running = running;
}
private int FailedTimes = 0; // 超过一定次数断开连接
private bool Read(Socket socket)
{
// 接收客户端消息
try
{
byte[] buffer = new byte[2048];
int length = socket.Receive(buffer);
if (length > 0)
{
string msg = Encoding.GetEncoding(Config.DEFAULT_ENCODING).GetString(buffer, 0, length);
int type = GetType(msg);
msg = GetMessage(msg);
Console.Write("收到来自:客户端(" + type + " -> " + msg);
buffer = new byte[2048];
length = socket.Receive(buffer);
switch (type)
{
case (int)SocketEnums.ReadType.Login:
break;
case (int)SocketEnums.ReadType.CheckLogin:
break;
case (int)SocketEnums.ReadType.Logout:
break;
case (int)SocketEnums.ReadType.HeartBeat:
break;
}
if (Send(socket, type, msg))
return true;
throw new Exception();
}
throw new Exception();
}
catch (Exception e)
{
Console.WriteLine("ERROR客户端没有回应。\n" + e.StackTrace);
return false;
}
}
private bool Send(Socket socket, int type, string msg, object[]? objs = null)
{
// 发送消息给客户端
try
{
string send = MakeMessage(type, msg);
byte[] buffer = new byte[2048];
buffer = Encoding.GetEncoding(Config.DEFAULT_ENCODING).GetBytes(Convert.ToString(send));
if (socket.Send(buffer) > 0)
{
Console.WriteLine("发送给:客户端(" + type + " <- " + msg);
return true;
}
throw new Exception();
}
catch (Exception e)
{
Console.WriteLine("ERROR客户端没有回应。" + e.StackTrace);
return false;
}
}
private int GetType(string msg)
{
return Convert.ToInt32(msg[..(msg.IndexOf(';') - 1)]);
}
private string GetMessage(string msg)
{
return msg.Substring(msg.IndexOf(';') + 1, msg.Length - 1);
}
private string MakeMessage(int type, string msg)
{
return type + ";" + msg;
}
public void Start()
{
Task StreamReader = Task.Factory.StartNew(() =>
{
CreateStreamReader();
});
}
private void CreateStreamReader()
{
Thread.Sleep(1000);
Console.WriteLine("Creating: StreamReader...OK");
while (Running)
{
if (Socket != null)
if (!Read(Socket))
{
FailedTimes++;
if (FailedTimes >= Config.MAX_CONNECTFAILED)
{
Console.WriteLine("ERROR: Too Many Faileds.");
Console.WriteLine("DONE: StringStream is Closed.");
break;
}
}
else if (FailedTimes - 1 >= 0) FailedTimes--;
else
{
Console.WriteLine("ERROR: Socket is Closed.");
Console.WriteLine("DONE: StringStream is Closed.");
break;
}
}
}
}
}