ServerSocket
服务器与客户端建立连接的流程

在SimpleServer的Net文件夹内新建ServerSocket
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| using System.Net.Sockets; using System.Net;
namespace SimpleServer.Net { internal class ServerSocket : SingletonPattern<ServerSocket> { public static string PublicKey = "ATAOServer"; public static string SecretKey = "ATAO_UP&&jiiEf=Ted"; #if DEBUG private string m_IPAddress = "127.0.0.1"; #else private string m_IPAddress = "172.56.756.31"; #endif private const int m_Port = 8011; private static Socket? m_ListenSocket; private static List<Socket> m_CheckReadList = new List<Socket>();
public void Init() { IPAddress ip = IPAddress.Parse(m_IPAddress); IPEndPoint iPEndPoint = new IPEndPoint(ip, m_Port);
m_ListenSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); m_ListenSocket.Bind(iPEndPoint); m_ListenSocket.Listen(50000); }
} }
|
Log4Net
服务器需要有自己的Log工具,关于基本的log工具应该怎么设计,见下面的文章:
浅谈LOG日志的写法 - 星朝 - 博客园 (cnblogs.com)
总之,Log工具帮助及时Debug,并且还需要将日志保存到本地。
这里封装一下Log4Net插件作为日志工具。
在ServerBase工程中添加一个类,命名为Debug
点击“工具——NuGet包管理器——管理解决方案的NuGet程序包”,在弹出的窗口中搜索“log4net”,安装在ServerBase项目内。
config
要使用Log4Net,首先需要编写Log的配置,现放一个Log4net配置参考文章:
Log4net 配置详解 - 虔城墨客 - 博客园 (cnblogs.com)
Log4Net详解_log4net配置文件详解_李宥小哥的博客-CSDN博客
log4Net官网的config例子:Apache log4net – Apache log4net: Config Examples - Apache log4net
在ServerBase项目内添加log4net.config文件,文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <log4net> <root> <level value="All"/> <appender-ref ref="RollingLogFileAppender"/> <appender-ref ref="ConsoleAppender"/> </root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="log\logfile.log"/> <appendToFile value="true"/> <Encoding value="UTF-8" /> <param name= "DatePattern" value= "yyyy-MM-dd".log""/> <param name= "MaxSizeRollBackups" value= "10"/> <param name= "StaticLogFileName" value= "false"/> <param name="RollingStyle" value="Date" /> <param name="maximumFileSize" value="500KB" /> <layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m %logger %n" /> </layout> </appender>
<appender name="ConsoleAppender" type="log4net.Appender.ManagedColoredConsoleAppender"> <mapping> <level value="INFO" /> <foreColor value="Green" /> </mapping> <mapping> <level value="DEBUG" /> <foreColor value="White" /> </mapping> <mapping> <level value="WARN" /> <foreColor value="Yellow" /> </mapping> <mapping> <level value="ERROR" /> <foreColor value="DarkRed" /> </mapping> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date{HH:mm:ss,fff} [%-5level] %m %n" /> </layout>
<filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="Error" /> </filter> </appender> </log4net> </configuration>
|
在解决方案资源管理器中选中“log4net.config”,在下面的“属性”窗口——高级——复制到输出目录——选择“始终复制”。
AssemblyInfo
在解决方案资源管理器中选中“ServerBase”,右键——添加——新建项,在弹出的窗口中选择“程序集信息文件”,命名为AssemblyInfo.cs
在其中添加:
1
| [assembly: log4net.Config.XmlConfigurator(ConfigFile ="log4net.config",ConfigFileExtension ="config",Watch = true)]
|
包装一层Log
在ServerBase里面,新建Debug.cs文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| using log4net; using log4net.Config; using System; using System.IO;
namespace ServerBase { public static class Debug { private static ILog m_Log;
static Debug() { XmlConfigurator.ConfigureAndWatch(new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config")));
m_Log = LogManager.GetLogger(typeof(Debug)); } public static void Log(object message) { m_Log.Debug(message); } public static void Log(string format, params object[] args) { m_Log.DebugFormat(format, args); } public static void LogInfo(object message) { m_Log.Info(message); } public static void LogInfo(string format, params object[] args) { m_Log.InfoFormat(format, args); } public static void LogWarn(object message) { m_Log.Warn(message); } public static void LogWarn(string format,params object[] args) { m_Log.WarnFormat(format, args); } public static void LogError(object message) { m_Log.Error(message); } public static void LogError(string format, params object[] args) { m_Log.ErrorFormat(format, args); } public static void LogFatal(object message) { m_Log.Fatal(message); } public static void LogFatal(string format, params object[] args) { m_Log.FatalFormat(format, args); } } }
|
完善ServerSocket
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public void Init() { IPAddress ip = IPAddress.Parse(m_IPAddress); IPEndPoint iPEndPoint = new IPEndPoint(ip, m_Port);
m_ListenSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); m_ListenSocket.Bind(iPEndPoint); m_ListenSocket.Listen(50000);
EndPoint? endPoint = m_ListenSocket.LocalEndPoint;
if (endPoint != null ) Debug.LogInfo("服务器启动监听{0}成功",endPoint); }
|
在Program
初始化ServerSocket
1 2 3 4 5 6 7 8 9 10 11 12 13
| using SimpleServer.Net;
namespace SimpleServer { internal class Program { static void Main(string[] args) { ServerSocket.Instance.Init(); Console.ReadLine(); } } }
|
Log生成的位置
按照log4net.config的配置,在Debug模式下,log文件的位置为:
1
| E:\CSharpProjects\SimpleServer\SimpleServer\bin\Debug\net6.0\log\logfile.log2023-09-08.log
|