C# 代码分析:问题和优化建议
{/'title/':/'请帮我分析一下此段c#代码有什么问题/',/'description/':/'本文分析了一段 C# 代码,指出了代码中的问题,包括命名规范、代码结构、路径硬编码、异常处理、重复代码、线程使用、数据结构、错误处理和变量作用域等方面。/',/'keywords/':/'C# 代码分析,代码优化,命名规范,代码结构,路径硬编码,异常处理,重复代码,线程安全,数据结构,错误处理,变量作用域/',/'content/':/'using Microsoft.Office.Interop.Excel;using System;using System.Collections;using System.IO;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;if (!Directory.Exists(@/'Logs///')) Directory.CreateDirectory(@/'Logs///');int tickSpace = 100;int port = 80;bool wait = false;bool running = true;DateTime startTime = DateTime.Now;ArrayList messageList = new();ArrayList requests = new();ArrayList sends = new();StreamWriter writer = new StreamWriter(@/'Logs///' + startTime.ToString(/'yyyy_MM_dd_HH_mm_ss/') + /'.log/');Dictionary<IPAddress, int> connected = new Dictionary<IPAddress, int>();new Thread(Start).Start();new Thread(Command).Start();while (running){Thread.Sleep(tickSpace);TryReportMessage();if (requests.Count > 0) new Thread(SolveMessage).Start();}ReportMessage(/'服务器已停止/', 0);void Start(){wait = false;running = true;startTime = DateTime.Now;messageList = new();Console.Title = /'云上学校服务端 启动中/';ReportMessage(/'正在启动中/', 0);new Thread(Check).Start();wait = true;while (wait) Thread.Sleep(tickSpace);string[] config = File.ReadAllLines(@/'ServerConfig.cfg/');int port = int.Parse(config[0]);int sendPort = int.Parse(config[1]);tickSpace = int.Parse(config[2]);new Thread(Main).Start();}void Check(){ArrayList logList = new();ArrayList warningList = new();ArrayList errorList = new();{ReportMessage(/'检查Logs文件夹是否存在/', 0);if (!Directory.Exists(@/'Logs///')) {warningList.Add(/'Logs文件夹缺失,已自动补充/');Directory.CreateDirectory(@/'Logs///');}} {ReportMessage(/'检查配置文件是否存在/', 0);if (!File.Exists(@/'ServerConfig.cfg/')) {warningList.Add(/'配置文件缺失,已自动补充/');File.WriteAllText(@/'ServerConfig.cfg/', /'80//n90//n100/');//服务器接收端口号,发送端口号,tick间隔}} {ReportMessage(/'检查用户文件是否存在/', 0);if (!Directory.Exists(@/'Accounts///')) {warningList.Add(/'Accounts文件夹缺失,已自动补充/');Directory.CreateDirectory(@/'Accounts///');}} {bool noAdmin = true;ReportMessage(/'检查用户列表是否正常/', 0);if (!Directory.Exists(@/'Accounts///')) {warningList.Add(/'Accounts文件夹缺失,已自动补充/');Directory.CreateDirectory(@/'Accounts///');}foreach (string name in Directory.GetFiles(@/'Accounts///')) {string[] file = File.ReadAllLines(@/'Accounts/////' + name);}if (noAdmin) warningList.Add(/'没有任何一名管理员!请使用adduser指令添加一个以方便管理/');}ReportMessage(/'已完成启动检查/', 0);wait = false;}void Command(){while (running) {char c = Console.ReadKey().KeyChar;wait = true;string input = c + Console.ReadLine();writer.WriteLine(/'>>>/' + input);writer.Flush();string[] command;command = input.Split(' ');switch (command[0]) {case /'start/':if (running) ReportMessage(/'服务器已经在运行了!/', 0);else Start();break;case /'check/':new Thread(Check).Start();break;case /'exit/':ReportMessage(/'你确定要退出吗?如果是,请输入 y ;否则请输入任何其他字符/', 1);if (Console.ReadKey().KeyChar == 'y') {Console.Title = /'云上学校服务端 正在退出/';ReportMessage(/'已开始退出/', 0);tickSpace = 100;running = false;} else {ReportMessage(/'退出已取消/', 1);}break;case /'clear/':Console.Clear();ReportMessage(/'已执行清屏/', 0);break;case /'address/':IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());foreach (IPAddress ip in ipEntry.AddressList) ReportMessage(/'可用访问地址 /' + ip.ToString() + /':' + File.ReadAllText(@/'ServerConfig.cfg/'), 0);break;case /'adduser/':if (command.Length == 5) {switch (command[3]) {case /'teacher/':case /'admin/':break;default:command[3] = /'student/';break;}if (Directory.Exists(@/'Accounts///' + command[1] + /'///')) ReportMessage(/'账号已存在,已执行信息覆盖/', 1);else Directory.CreateDirectory(@/'Accounts///' + command[1] + /'///');File.WriteAllLines(@/'Accounts///' + command[1] + /'//user.cfg/', new string[] {command[2], command[3], /'/', command[4]});} else {ReportMessage(/'指令配置错误:参数数量异常/', 2);break;}if (command[1].Length < 6) {ReportMessage(/'指令配置错误:账号太短,至少6个字符/', 2);break;}if (command[2].Length < 6) {ReportMessage(/'指令配置错误:密码太短,至少6个字符/', 2);break;}break;case /'help/':if (command.Length == 1) {ReportMessage(/'----------帮助列表----------/', 0);ReportMessage(/'check//t重新检查服务器/', 0);ReportMessage(/'exit//t关闭服务器/', 0);ReportMessage(/'help//t获取指令列表/', 0);ReportMessage(/'address//t获取可用的连接地址列表/', 0);ReportMessage(/'adduser//t添加一个新的用户/', 0);ReportMessage(/'clear//t清屏/', 0);ReportMessage(/'输入help <指令> 可以获取详细参数配置(如果有)/', 0);} else switch (command[1]) {case /'adduser/':ReportMessage(/'adduser <新用户的账号> <密码> <权限类型> <用户名>/', 0);ReportMessage(/'<权限类型>可填写student,teacher,admin之一/', 0);break;default:ReportMessage(/'该指令不存在或没有更多参数配置/', 0);break;}break;default:ReportMessage(/'未知的指令!请输入 help 以获取帮助/', 2);break;}wait = false;}}void Main()//负责接收并处理各种网络请求{Console.Title = /'云上学校服务端 正在运行/';ReportMessage(/'服务器启动完成,耗时/' + ((int)(DateTime.Now - startTime).TotalMilliseconds / 1000.0) + /'秒/', 0);IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());foreach (IPAddress ip in ipEntry.AddressList) ReportMessage(/'可用访问地址 /' + ip.ToString() + /':' + File.ReadAllLines(@/'ServerConfig.cfg/')[0], 0);new Thread(Listen).Start();while (running) {if (sends.Count > 0) {InternetConnect.IpInfo? ipInfoN = (InternetConnect.IpInfo?)sends[0];if (ipInfoN != null) {InternetConnect.IpInfo ipInfo = (InternetConnect.IpInfo)ipInfoN;sends.RemoveAt(0);Send(ipInfo.ip, ipInfo.port, ipInfo.info);}} else Thread.Sleep(tickSpace);}}void ReportMessage(string message, int level){messageList.Add(new Message(DateTime.Now, message, level));writer.Write(new Message(DateTime.Now, message, level).ToString() + /'//n/');writer.Flush();TryReportMessage();}void TryReportMessage(){if (!wait) {foreach (Message m in messageList) Console.WriteLine(m.ToString());messageList.Clear();}}void Listen(){try {UdpClient udpclient = new UdpClient(port);IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Any, port);InternetConnect.IpInfo ret;while (running) {byte[] bytes = udpclient.Receive(ref ipendpoint);ret.ip = ipendpoint.Address;ret.info = Encoding.Default.GetString(bytes, 0, bytes.Length);ret.port = 110;requests.Add(ret);ReportMessage(/'来自/' + ret.ip.ToString() + /'的请求/' + ret.info.Split('//n')[0], 0);} } catch (Exception e) {ReportMessage(e.ToString(), 2);new Thread(Listen).Start();} finally {}}void Send(IPAddress iPAddress, int port, string message){Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPAddress ipaddress = iPAddress;byte[] btContent = Encoding.Default.GetBytes(message);IPEndPoint ipendpoint = new IPEndPoint(ipaddress, port);socket.SendTo(btContent, ipendpoint);socket.Close();}void SolveMessage(){InternetConnect.IpInfo? ipInfoN = (InternetConnect.IpInfo?)requests[0];if (ipInfoN != null) {InternetConnect.IpInfo ipInfo = (InternetConnect.IpInfo)ipInfoN;requests.RemoveAt(0);string[] messages = ipInfo.info.Split('//n');switch (messages[0]) {case /'clientConnectRequest/':if (File.Exists(@/'Accounts///' + messages[3] + /'//user.cfg/')) {string[] user = File.ReadAllLines(@/'Accounts///' + messages[3] + /'//user.cfg/');if (messages[4] == user[0]) {sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, /'connectFormed//n/' + user[1] + /'//n/' + user[2] + /'//n/' + user[3]));ReportMessage(ipInfo.ip.ToString() + /'已作为/' + messages[3] + /'连接到服务器/', 0);} else {sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, /'connectRefused/'));ReportMessage(ipInfo.ip.ToString() + /'试图登录到/' + messages[3] + /',但输入了错误的密码/', 0);} } else {ReportMessage(ipInfo.ip.ToString() + /'试图登录一个不存在的账号/', 0);sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, /'connectRefused/'));}break;case /'makeQuestion/':Directory.CreateDirectory(@/'ExamPapers///' + messages[1] + /'///');if (int.Parse(messages[2]) <= 0) File.WriteAllLines(@/'ExamPapers///' + messages[1] + /'//.config.cfg/', new string[] {messages[2], messages[3], messages[4]});else File.WriteAllLines(@/'ExamPapers///' + messages[1] + /'///' + messages[2] + /'.que/', new string[] {messages[3], messages[4], messages[5], messages[6], messages[7], messages[8], messages[9], messages[10], messages[11], messages[12], messages[13]});ReportMessage(ipInfo.ip.ToString() + /'对试卷/' + messages[1] + /'进行了修改/', 0);break;case /'paperList/':string file = /'/';foreach (string s in Directory.GetDirectories(@/'ExamPapers///')) {file += s.Split('//', '.')[1] + /'//n/';}sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, file));break;case /'readQuestion/':file = /'/';try {foreach (string s in File.ReadAllLines(@/'ExamPapers///' + messages[1] + /'///' + messages[2] + /'.que/')) file += s + /'//n/';sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, file));} catch {sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, /'/'));}break;case /'makeExam/':Directory.CreateDirectory(@/'Exams///' + messages[1] + /'///');File.WriteAllLines(@/'Exams///' + messages[1] + /'//exam.cfg/', new string[] {messages[2]});File.WriteAllLines(@/'Exams///' + messages[1] + /'//total.txt/', new string[] {/'Username//tID//tTotal//tPointEveryQuestion/'});sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, /'succeed/'));break;case /'examList/':file = /'/';foreach (string s in Directory.GetDirectories(@/'Exams///')) {file += s.Split('//', '.')[1] + /'//n/';}sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, file));break;case /'file/':sends.Add(new InternetConnect.IpInfo(ipInfo.ip, ipInfo.port, File.ReadAllText(@messages[1])));break;case /'fileAddLine/':string[] a = File.ReadAllText(messages[1]).Split('//n'), b = new string[a.Length + 1];for (int i = 0; i < a.Length; i++) b[i] = a[i];b[a.Length] = messages[2];File.WriteAllLines(messages[1], b);break;} }}struct Message{DateTime time;string message;int level;public Message(DateTime time, string message, int level) {this.time = time;this.message = message;this.level = level;}public override string ToString() {return time.ToString(/'G/') + /' /' + Level() + /' /' + message;}public string Level() {switch (level) {case 1:return /'Warn /';case 2:return /'Error/';default:return /'Info /';}}} /
原文地址: https://www.cveoy.top/t/topic/pFy1 著作权归作者所有。请勿转载和采集!