2022-08-30 23:51:28 +08:00

145 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 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+)+)$");
}