mirror of
https://github.com/project-redbud/FunGame-Server.git
synced 2025-04-23 20:49:35 +08:00
145 lines
4.4 KiB
C#
145 lines
4.4 KiB
C#
using System.Net.Sockets;
|
||
using System.Net;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using System;
|
||
using FunGameServer.Sockets;
|
||
using System.Net.WebSockets;
|
||
using FunGameServer.Models.Config;
|
||
using FunGameServer.Utils;
|
||
|
||
bool Running = true;
|
||
Socket? ServerSocket = null;
|
||
|
||
string hostname = Config.SERVER_NAME;
|
||
int port = Config.SERVER_PORT;
|
||
|
||
Console.Title = Config.CONSOLE_TITLE;
|
||
|
||
try
|
||
{
|
||
Task t = Task.Factory.StartNew(() =>
|
||
{
|
||
// 创建IP地址终结点对象
|
||
IPEndPoint ip = new(IPAddress.Any, port);
|
||
|
||
// 创建TCP Socket对象并绑定终结点
|
||
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||
ServerSocket.Bind(ip);
|
||
|
||
// 开始监听连接
|
||
ServerSocket.Listen(Config.MAX_PLAYERS);
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "服务器启动成功,正在监听 . . .");
|
||
|
||
while (Running)
|
||
{
|
||
Socket socket;
|
||
try
|
||
{
|
||
socket = ServerSocket.Accept();
|
||
IPEndPoint? clientIP = (IPEndPoint?)socket.RemoteEndPoint;
|
||
if (clientIP != null)
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "客户端" + clientIP.ToString() + "连接 . . .");
|
||
else
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "未知地点客户端连接 . . .");
|
||
if (Read(socket) && Send(socket))
|
||
Task.Factory.StartNew(() =>
|
||
{
|
||
new ClientSocket(socket, Running).Start();
|
||
});
|
||
else
|
||
if (clientIP != null)
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "客户端" + clientIP.ToString() + "连接失败。");
|
||
else
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "客户端连接失败。");
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "ERROR: 客户端断开连接!\n" + e.StackTrace);
|
||
}
|
||
}
|
||
|
||
});
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
SocketHelper.WriteLine(e.StackTrace);
|
||
if (ServerSocket != null)
|
||
{
|
||
ServerSocket.Close();
|
||
ServerSocket = null;
|
||
}
|
||
}
|
||
finally
|
||
{
|
||
while (Running)
|
||
{
|
||
string? order = "";
|
||
order = Console.ReadLine();
|
||
SocketHelper.WriteLine("\r> " + order);
|
||
if (order != null && !order.Equals(""))
|
||
{
|
||
switch (order)
|
||
{
|
||
case "quit":
|
||
Running = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "服务器已关闭,按任意键退出程序。");
|
||
Console.ReadKey();
|
||
|
||
|
||
bool Read(Socket socket)
|
||
{
|
||
// 接收客户端消息
|
||
byte[] buffer = new byte[2048];
|
||
int length = socket.Receive(buffer);
|
||
if (length > 0)
|
||
{
|
||
string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length);
|
||
string typestring = SocketHelper.GetTypeString(SocketHelper.GetType(msg));
|
||
msg = SocketHelper.GetMessage(msg);
|
||
if (typestring != SocketEnums.TYPE_UNKNOWN)
|
||
{
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "[ 客户端(" + typestring + ")] -> " + msg);
|
||
return true;
|
||
}
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "客户端发送了不符合FunGame规定的字符,拒绝连接。");
|
||
return false;
|
||
}
|
||
else
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "客户端没有回应。");
|
||
return false;
|
||
}
|
||
|
||
bool Send(Socket socket)
|
||
{
|
||
// 发送消息给客户端
|
||
string msg = ">> 已连接至服务器 -> [ " + hostname + " ] 连接成功";
|
||
byte[] buffer = new byte[2048];
|
||
buffer = Config.DEFAULT_ENCODING.GetBytes(SocketHelper.MakeMessage((int)SocketEnums.Type.CheckLogin, msg));
|
||
if (socket.Send(buffer) > 0)
|
||
{
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "[ 客户端 ] <- " + msg);
|
||
return true;
|
||
}
|
||
else
|
||
SocketHelper.WriteLine(SocketHelper.GetPrefix() + "无法传输数据,与客户端的连接可能丢失。");
|
||
return false;
|
||
}
|
||
|
||
bool IsIP(string ip)
|
||
{
|
||
//判断是否为IP
|
||
return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
|
||
}
|
||
|
||
bool IsEmail(string ip)
|
||
{
|
||
//判断是否为Email
|
||
return Regex.IsMatch(ip, @"^(\w)+(\.\w)*@(\w)+((\.\w+)+)$");
|
||
} |