| @@ -11,25 +11,52 @@ namespace StuMgmLib.MyNameSpace | |||
| { | |||
| public class Info | |||
| { | |||
| [Serializable] | |||
| public class ClientSend | |||
| internal const Int16 tokenMaxCount = 32767; | |||
| internal static Dictionary<short, int> myToken = new Dictionary<short, int>(); | |||
| } | |||
| #region ClientClass | |||
| public enum ClientFunc | |||
| { | |||
| VerifyLogin = 1, | |||
| GetCourseInfo = 2, | |||
| GetUserCourseInfo = 3, | |||
| } | |||
| public enum LvErr | |||
| { | |||
| NotFound = -1, | |||
| Error = -2, | |||
| Admin = 1, | |||
| Teacher = 2, | |||
| Student = 3, | |||
| } | |||
| [Serializable] | |||
| public class ClientRequest | |||
| { | |||
| public ClientFunc Func; | |||
| public object Object; | |||
| public ClientRequest(ClientFunc func, object obj) | |||
| { | |||
| public short Account { get; set; } | |||
| public string Password { get; set; } | |||
| public string[] SqlStr { get; set; } | |||
| Func = func; | |||
| Object = obj; | |||
| } | |||
| [Serializable] | |||
| public class ServerSend | |||
| } | |||
| [Serializable] | |||
| public class UserInfo | |||
| { | |||
| public short Account; | |||
| public string Password; | |||
| public Int16 Token; | |||
| public LvErr UserLev; | |||
| public UserInfo(short account, string password) // Changed | |||
| { | |||
| public short Permission { get; set; } | |||
| public DataSet Ds { get; set; } | |||
| public bool SqlSucceed { get; set; } | |||
| Account = account; | |||
| Password = password; | |||
| } | |||
| } | |||
| #region Unused | |||
| #region 题目信息 | |||
| [Serializable] | |||
| public class CourseInfo | |||
| { | |||
| @@ -39,105 +66,43 @@ namespace StuMgmLib.MyNameSpace | |||
| public string Name; | |||
| public string Content; | |||
| } | |||
| #endregion | |||
| #region 学生题目信息一览 | |||
| [Serializable] | |||
| public enum CourseStatusEnum | |||
| { | |||
| undo, // 未开始 | |||
| doing, // 进行中 | |||
| waiting, // 等待验收 | |||
| failed, // 验收失败 | |||
| preSharing, // 准备分享 | |||
| pass // 验收通过 | |||
| //lll, | |||
| //...// | |||
| } | |||
| [Serializable] | |||
| public class CourseStatus | |||
| public class UserCourseInfo | |||
| { | |||
| public short CourseId; | |||
| public CourseStatusEnum Status; | |||
| public short JobId;//工号 | |||
| public string Name;//姓名 | |||
| public string Status; | |||
| // ..public DateTime Entry; | |||
| public string Details;//信息描述 | |||
| } | |||
| [Serializable] | |||
| public class UserInfo | |||
| { | |||
| public short JobId; | |||
| public string Name; | |||
| public List<CourseStatus> CourseStatus; | |||
| } | |||
| #endregion | |||
| #region 学生单题详细信息 | |||
| //public class HistoryInfo | |||
| //{ | |||
| // DateTime Time; | |||
| // string Describe; | |||
| //} | |||
| //public class DetailInfo | |||
| //{ | |||
| // public short CourseId; | |||
| // public short JobId; | |||
| // List<HistoryInfo> Describes; | |||
| //} | |||
| #endregion | |||
| #region 未使用 | |||
| class Server | |||
| #region ServerClass | |||
| [Serializable] | |||
| public class ServerResponse | |||
| { | |||
| //List<CourseInfo> GetCourseInfo(); | |||
| //UserInfo GetUserInfo(short jobId); | |||
| //DetailInfo GetDetailInfo(short jobId, short courseId); | |||
| public byte[] GetUser(short jobId) | |||
| public LvErr Lev; | |||
| public int Token; | |||
| //public string CourseStatus; | |||
| public object Object; | |||
| public ServerResponse(object obj) | |||
| { | |||
| UserInfo info = new UserInfo(); | |||
| info.JobId = 111; | |||
| info.Name = "aaaa"; | |||
| info.CourseStatus = new List<CourseStatus>(); | |||
| CourseStatus aa = new CourseStatus(); | |||
| aa.CourseId = 222; | |||
| aa.Status = CourseStatusEnum.undo; // 做题状态 | |||
| info.CourseStatus.Add(aa); | |||
| return BinaryED.Serialize(info); | |||
| Object = obj; | |||
| } | |||
| public UserInfo Parse(byte[] bt) | |||
| { | |||
| return BinaryED.Deserialize<UserInfo>(bt); | |||
| //MemoryStream ms = new MemoryStream(bt); | |||
| //BinaryFormatter iFormatter = new BinaryFormatter(); | |||
| //UserInfo obj = (UserInfo)iFormatter.Deserialize(ms); | |||
| //return obj; | |||
| } | |||
| } | |||
| #endregion | |||
| class StudentInfo | |||
| { | |||
| //List<CourseInfo> GetCourseInfo(); | |||
| //UserInfo GetUserInfo(short jobId); | |||
| //DetailInfo GetDetailInfo(short jobId, short courseId); | |||
| } | |||
| class Program | |||
| { | |||
| //static void Main(string[] args) | |||
| //{ | |||
| // Server s = new Server(); | |||
| // byte[] buf = s.GetUser(0); | |||
| // UserInfo aa = s.Parse(buf); | |||
| //} | |||
| } | |||
| #endregion | |||
| } | |||
| #endregion | |||
| } | |||
| @@ -0,0 +1,85 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Data; | |||
| namespace StuMgmLib.MyNameSpace | |||
| { | |||
| enum CommErr | |||
| { | |||
| Success, | |||
| FailSerial, | |||
| FailDeserial, | |||
| FailConnect, | |||
| FailSend, | |||
| FailReceive, | |||
| ErrData, | |||
| } | |||
| public enum ClientFunc | |||
| { | |||
| VerifLogin = 1, | |||
| GetCourseInfo = 2, | |||
| GetUserCourseInfo = 3, | |||
| } | |||
| public enum LvErr | |||
| { | |||
| NotFound = -1, | |||
| Error = -2, | |||
| Admin = 1, | |||
| Teacher = 2, | |||
| Student = 3, | |||
| } | |||
| [Serializable] | |||
| public class ClientRequest | |||
| { | |||
| public ClientFunc Func; | |||
| public object Object; | |||
| public ClientRequest(ClientFunc func, object obj) | |||
| { | |||
| Func = func; | |||
| Object = obj; | |||
| } | |||
| } | |||
| [Serializable] | |||
| public class UserInfo | |||
| { | |||
| public string Account; | |||
| public string Password; | |||
| public string Token; | |||
| public LvErr UserRole; | |||
| public UserInfo(string account, string password) | |||
| { | |||
| Account = account; | |||
| Password = password; | |||
| } | |||
| } | |||
| public class CourseInfo | |||
| { | |||
| public short Id; | |||
| public short Pid; | |||
| public int Time; | |||
| public string Name; | |||
| public string Content; | |||
| } | |||
| [Serializable] | |||
| public enum CourseStatusEnum | |||
| { | |||
| //lll, | |||
| //...// | |||
| } | |||
| [Serializable] | |||
| public class UserCourseInfo | |||
| { | |||
| public short JobId;//工号 | |||
| public string Name;//姓名 | |||
| // ..public DateTime Entry; | |||
| public string InfoDescribe;//信息描述 | |||
| } | |||
| } | |||
| @@ -40,9 +40,9 @@ namespace StuMgmLib.MyNameSpace | |||
| /// <summary> | |||
| /// 解析ClientSend | |||
| /// </summary> | |||
| public static Info.ServerSend ClientSendAnalyze(Info.ClientSend cs) | |||
| public static ServerSend ClientSendAnalyze(ClientSend cs) | |||
| { | |||
| Info.ServerSend ss = new Info.ServerSend(); | |||
| ServerSend ss = new ServerSend(); | |||
| ss.Permission = loginVerify(cs.Account, cs.Password); // 验证身份 | |||
| if (ss.Permission < 0) // 小于0,则权限有误 | |||
| { | |||
| @@ -0,0 +1,95 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Diagnostics; | |||
| using System.Net; | |||
| using System.Net.Sockets; | |||
| namespace StuMgmLib.MyNameSpace | |||
| { | |||
| class SystemComm | |||
| { | |||
| #region 基本函数 | |||
| const int bufSize = 1024 * 1024; | |||
| static IPEndPoint m_ipEndpoint; | |||
| static Socket m_socket; | |||
| static byte[] m_buf; | |||
| internal static void Init(string ip, int port) | |||
| { | |||
| IPAddress ipAdress = IPAddress.Parse(ip); | |||
| m_ipEndpoint = new IPEndPoint(ipAdress, port); | |||
| m_buf = new byte[bufSize]; | |||
| } | |||
| static bool Connect() | |||
| { | |||
| try | |||
| { | |||
| m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||
| m_socket.Connect(m_ipEndpoint); | |||
| return m_socket.Connected; | |||
| } | |||
| catch (Exception ex) | |||
| { | |||
| Debug.Print(ex.Message); | |||
| return false; | |||
| } | |||
| } | |||
| static bool Send(byte[] data) | |||
| { | |||
| try | |||
| { | |||
| m_socket.Send(data); | |||
| return true; | |||
| } | |||
| catch(Exception e) | |||
| { | |||
| Debug.Print(e.Message); | |||
| return false; | |||
| } | |||
| } | |||
| static bool Receive() | |||
| { | |||
| try | |||
| { | |||
| Array.Clear(m_buf, 0, m_buf.Length); | |||
| m_socket.Receive(m_buf); | |||
| return true; | |||
| } | |||
| catch (Exception e) | |||
| { | |||
| Debug.Print(e.Message); | |||
| return false; | |||
| } | |||
| } | |||
| static void DisConnect() | |||
| { | |||
| m_socket.Close(); | |||
| } | |||
| #endregion | |||
| internal static CommErr GetData(ClientRequest req,out object o) | |||
| { | |||
| o = null; | |||
| if (!Connect()) | |||
| return CommErr.FailConnect; | |||
| byte[] sendBuf; | |||
| if (!Utility.BinSerialize(req, out sendBuf)) | |||
| return CommErr.FailSerial; | |||
| if (!Send(sendBuf)) | |||
| return CommErr.FailSend; | |||
| if (!Receive()) | |||
| return CommErr.FailReceive; | |||
| DisConnect(); | |||
| if (!Utility.BinDeserialize(m_buf, out o)) | |||
| return CommErr.FailDeserial; | |||
| return CommErr.Success; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,217 @@ | |||
| using MySql.Data.MySqlClient; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Data; | |||
| using System.Diagnostics; | |||
| using System.IO; | |||
| using System.Reflection; | |||
| using System.Runtime.Serialization; | |||
| using System.Runtime.Serialization.Formatters.Binary; | |||
| using System.Text; | |||
| namespace StuMgmLib.MyNameSpace | |||
| { | |||
| class SystemCtrl | |||
| { | |||
| /// <summary> | |||
| /// 序列化 | |||
| /// </summary> | |||
| static byte[] Serialize<T>(T c) | |||
| { | |||
| MemoryStream ms = new MemoryStream(); | |||
| BinaryFormatter iFormatter = new BinaryFormatter(); | |||
| iFormatter.Serialize(ms, c); | |||
| byte[] buf = ms.GetBuffer(); | |||
| return buf; | |||
| } | |||
| /// <summary> | |||
| /// 反序列化 | |||
| /// </summary> | |||
| static T Deserialize<T>(byte[] buf) | |||
| { | |||
| MemoryStream ms = new MemoryStream(buf); | |||
| BinaryFormatter iFormatter = new BinaryFormatter(); | |||
| var obj = (T)iFormatter.Deserialize(ms); | |||
| return obj; | |||
| } | |||
| /// <summary> | |||
| /// 获取返回数据 | |||
| /// </summary> | |||
| public static byte[] GetServerResponse(byte[] clientRequset) | |||
| { | |||
| try | |||
| { | |||
| var cs = Deserialize<ClientRequest>(clientRequset); | |||
| ServerResponse sr = new ServerResponse(null); | |||
| switch (cs.Func) | |||
| { | |||
| case ClientFunc.VerifyLogin: | |||
| UserInfo ui = (UserInfo)cs.Object; | |||
| if (verifyLogin(ui, out sr.Lev)) | |||
| sr.Token = addToken(ui.Account, ref Info.myToken); | |||
| break; | |||
| case ClientFunc.GetCourseInfo: | |||
| sr.Object = getCourseInfo(); | |||
| Debug.Print(sr.Object.GetType().ToString()); | |||
| break; | |||
| case ClientFunc.GetUserCourseInfo: | |||
| short job_id; | |||
| UserCourseInfo uc = new UserCourseInfo(); | |||
| if (verifyToken((Dictionary<short, int>)cs.Object, out job_id)) | |||
| if (getUserCourseStatus(job_id, out uc.Status, out uc.Details)) | |||
| sr.Object = uc; | |||
| break; | |||
| } | |||
| return Serialize<ServerResponse>(sr); | |||
| } | |||
| catch | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| const string conStr = "data source=localhost; initial catalog=xinje; user id=root; pwd=980505;charset = utf8"; | |||
| static bool verifyLogin(UserInfo userInfo, out LvErr level) | |||
| { | |||
| level = LvErr.Error; | |||
| string qStu = "select * from user where account = " + userInfo.Account + " and password = '" + userInfo.Password + "'"; | |||
| MySqlConnection con = new MySqlConnection(conStr); | |||
| try | |||
| { | |||
| con.Open(); | |||
| MySqlCommand mCmd = new MySqlCommand(qStu, con); | |||
| MySqlDataReader mReader = mCmd.ExecuteReader(); | |||
| if (mReader.HasRows) | |||
| { | |||
| mReader.Read(); | |||
| level = (LvErr)mReader.GetInt16("level"); | |||
| return true; | |||
| } | |||
| else | |||
| { | |||
| level = LvErr.NotFound; | |||
| return false; | |||
| } | |||
| } | |||
| catch (MySqlException) | |||
| { | |||
| level = LvErr.Error; | |||
| return false; | |||
| } | |||
| finally | |||
| { | |||
| con.Close(); | |||
| } | |||
| } | |||
| static int addToken(short job_id, ref Dictionary<short, int> myToken) | |||
| { | |||
| if (myToken != null) | |||
| { | |||
| if (myToken.Count > Info.tokenMaxCount) // 清除缓存 | |||
| myToken.Clear(); | |||
| if (myToken.ContainsKey(job_id)) | |||
| { | |||
| myToken.Remove(job_id); | |||
| } | |||
| } | |||
| Random r = new Random(); // 伪随机 | |||
| int token = r.Next(); | |||
| myToken.Add(job_id, token); | |||
| return token; | |||
| } | |||
| static bool verifyToken(Dictionary<short, int> dic, out short account) | |||
| { | |||
| account = 0; | |||
| if (dic.Count != 1) | |||
| return false; | |||
| foreach (var item in dic) | |||
| { | |||
| if (!Info.myToken.ContainsKey(item.Key)) | |||
| return false; | |||
| if (Info.myToken[item.Key] == item.Value) | |||
| { | |||
| account = item.Key; | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| const int nameColumn = 1; | |||
| const int contentColumn = 3; | |||
| static List<CourseInfo> getCourseInfo() | |||
| { | |||
| List<CourseInfo> listCI = new List<CourseInfo>(); | |||
| string str = "select * from course_info"; | |||
| MySqlConnection con = new MySqlConnection(conStr); | |||
| try | |||
| { | |||
| con.Open(); | |||
| MySqlCommand mCmd = new MySqlCommand(str, con); | |||
| MySqlDataReader mReader = mCmd.ExecuteReader(); | |||
| while (mReader.Read()) | |||
| { | |||
| CourseInfo ci = new CourseInfo(); | |||
| ci.Id = mReader.GetInt16("id"); | |||
| ci.Pid = mReader.GetInt16("pid"); | |||
| ci.Time = mReader.GetInt16("time"); | |||
| ci.Name = (mReader.IsDBNull(nameColumn)) ? "无" : mReader.GetString("name"); | |||
| ci.Content = (mReader.IsDBNull(contentColumn)) ? "无" : mReader.GetString("content"); | |||
| listCI.Add(ci); | |||
| } | |||
| return listCI; | |||
| } | |||
| catch (MySqlException mySqlEx) | |||
| { | |||
| Debug.Print(DateTime.Now + " : " + mySqlEx.Message); | |||
| return null; | |||
| } | |||
| finally | |||
| { | |||
| con.Close(); | |||
| } | |||
| } | |||
| static bool getUserCourseStatus(short jobId, out string status, out string details) | |||
| { | |||
| status = ""; | |||
| details = ""; | |||
| string qStu = "select * from usercouse_info where job_id = " + jobId; | |||
| MySqlConnection con = new MySqlConnection(conStr); | |||
| try | |||
| { | |||
| con.Open(); | |||
| MySqlCommand mCmd = new MySqlCommand(qStu, con); | |||
| MySqlDataReader mReader = mCmd.ExecuteReader(); | |||
| mReader.Read(); | |||
| status = (mReader.IsDBNull(nameColumn)) ? " " : mReader.GetString("status"); | |||
| details = (mReader.IsDBNull(nameColumn)) ? " " : mReader.GetString("details"); | |||
| return true; | |||
| } | |||
| catch (MySqlException) | |||
| { | |||
| return false; | |||
| } | |||
| finally | |||
| { | |||
| con.Close(); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,40 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace StuMgmLib.MyNameSpace | |||
| { | |||
| class SystemData | |||
| { | |||
| static Dictionary<short, CourseInfo> allCourseInfo; | |||
| static Dictionary<short,CourseStatusEnum> allCourseStatus; | |||
| internal static CommErr InitSystemData() | |||
| { | |||
| CommErr err; | |||
| err = InitCourseInfo(); | |||
| if (err != CommErr.Success) | |||
| return err; | |||
| return CommErr.Success; | |||
| } | |||
| static CommErr InitCourseInfo() | |||
| { | |||
| CommErr err; | |||
| List<CourseInfo> courseInfo; | |||
| err = SystemCtrl.GetCourseInfo(out courseInfo); | |||
| if (err != CommErr.Success) | |||
| return err; | |||
| ...//将List<CourseInfo>转为Dictionary<short, CourseInfo> | |||
| return CommErr.Success; | |||
| } | |||
| internal static CommErr RefreshUserCourseInfo(UserCourseInfo info) | |||
| { | |||
| ...//将UserCourseInfo转为Dictionary<short,CourseStatusEnum> | |||
| return CommErr.Success; | |||
| } | |||
| } | |||
| } | |||
| @@ -4,6 +4,7 @@ | |||
| * DateTime : 2021/1/18 | |||
| */ | |||
| using System; | |||
| using System.Diagnostics; | |||
| using System.Net; | |||
| using System.Net.Sockets; | |||
| using System.Windows.Forms; | |||
| @@ -13,7 +14,8 @@ namespace StuMgmLib.MyNameSpace | |||
| // 还有一种验证连接方式: Token | |||
| public class TcpConn | |||
| { | |||
| private IPEndPoint IPP = null; | |||
| public EndPoint Ep; | |||
| private IPEndPoint ipp = null; | |||
| private Socket socket = null; | |||
| private Socket socketClient = null; | |||
| @@ -44,9 +46,9 @@ namespace StuMgmLib.MyNameSpace | |||
| #region 开启服务器 | |||
| public void OpenServer(string ipAddr, int port) | |||
| { | |||
| IPP = new IPEndPoint(IPAddress.Parse(ipAddr), port); | |||
| ipp = new IPEndPoint(IPAddress.Parse(ipAddr), port); | |||
| socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||
| socket.Bind(IPP); | |||
| socket.Bind(ipp); | |||
| socket.Listen(0); | |||
| SocketExist = true; | |||
| } | |||
| @@ -67,49 +69,44 @@ namespace StuMgmLib.MyNameSpace | |||
| /// <summary> | |||
| /// 接收客户端连接 | |||
| /// </summary> | |||
| public string AcceptConn() | |||
| public void AcceptConn() | |||
| { | |||
| try | |||
| { | |||
| socketClient = socket.Accept(); // 阻塞等待客户端连接 | |||
| return DateTime.Now.ToLongTimeString() + " : " + socketClient.RemoteEndPoint.ToString() + " 已连接 \n"; | |||
| Ep = socketClient.RemoteEndPoint; | |||
| } | |||
| catch (Exception) | |||
| catch (SocketException se) | |||
| { | |||
| return null; | |||
| Debug.Print(se.Message); | |||
| } | |||
| } | |||
| #endregion | |||
| const int recvTimeOut = 3000; // 设置接收超时时间 | |||
| const int recvTimeOut = -1; // 设置接收超时时间 | |||
| const int recvLength = 65535; | |||
| #region 接收数据 | |||
| /// <summary> | |||
| /// 接收数据 | |||
| /// </summary> | |||
| public string AcpMsg() | |||
| public void AcpMsg() | |||
| { | |||
| byte[] dataRecv = new byte[recvLength]; // 定义接收数组 | |||
| string reEdPoint = ""; | |||
| byte[] clientSend = new byte[recvLength]; // 定义接收数组 | |||
| try | |||
| { | |||
| reEdPoint = socketClient.RemoteEndPoint.ToString(); | |||
| socketClient.ReceiveTimeout = recvTimeOut; | |||
| socketClient.Receive(dataRecv); | |||
| socketClient.Receive(clientSend); | |||
| byte[] serverSend = SystemCtrl.GetServerResponse(clientSend); | |||
| var cs = BinaryED.Deserialize<Info.ClientSend>(dataRecv); | |||
| Info.ServerSend ss = DataAnalyze.ClientSendAnalyze(cs); | |||
| byte[] dataSend = BinaryED.Serialize<Info.ServerSend>(ss); | |||
| socketClient.Send(dataSend); | |||
| if (serverSend != null) | |||
| socketClient.Send(serverSend); | |||
| return DateTime.Now.ToLongTimeString() + " : " + reEdPoint + " 断开连接 \n"; | |||
| } | |||
| catch // 客户端断开连接 | |||
| catch (SocketException se) // 客户端断开连接 | |||
| { | |||
| if (socketClient != null) | |||
| return DateTime.Now.ToLongTimeString() + " : " + reEdPoint + " 断开连接 \n"; | |||
| else | |||
| return null; | |||
| Debug.Print(se.Message); | |||
| } | |||
| finally | |||
| { | |||
| @@ -43,9 +43,10 @@ | |||
| <Reference Include="System.Xml" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <Compile Include="MyNameSpace\BinaryED.cs" /> | |||
| <Compile Include="MyNameSpace\DataAnalyze.cs" /> | |||
| <Compile Include="MyNameSpace\CommonData.cs" /> | |||
| <Compile Include="MyNameSpace\SystemCtrl.cs"> | |||
| <SubType>Code</SubType> | |||
| </Compile> | |||
| <Compile Include="MyNameSpace\TcpConn.cs" /> | |||
| <Compile Include="Properties\AssemblyInfo.cs" /> | |||
| </ItemGroup> | |||
| @@ -191,7 +191,7 @@ | |||
| // tmr | |||
| // | |||
| this.tmr.Enabled = true; | |||
| this.tmr.Tick += new System.EventHandler(this.tmr_Tick); | |||
| //this.tmr.Tick += new System.EventHandler(this.tmr_Tick); | |||
| // | |||
| // Server | |||
| // | |||
| @@ -44,13 +44,17 @@ namespace StuMgmServer | |||
| try | |||
| { | |||
| if (sFlag == true) | |||
| { | |||
| tcpConn.CloseServer(); | |||
| btnSerSwitch.Text = "开启服务器"; | |||
| } | |||
| else if (sFlag != true) | |||
| { | |||
| int port = Convert.ToInt16(txtPort.Text); | |||
| tcpConn.OpenServer(cbxIPAddr.Text, port); | |||
| tUpdateUi = new Thread(updateHistory); | |||
| tUpdateUi.Start(); | |||
| btnSerSwitch.Text = "关闭服务器"; | |||
| } | |||
| } | |||
| catch (Exception ep) | |||
| @@ -66,21 +70,13 @@ namespace StuMgmServer | |||
| { | |||
| while (tcpConn.SocketExist) | |||
| { | |||
| setText(tcpConn.AcceptConn()); | |||
| setText(tcpConn.AcpMsg()); | |||
| tcpConn.AcceptConn(); | |||
| setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 建立连接 \n"); | |||
| tcpConn.AcpMsg(); | |||
| setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 断开连接 \n"); | |||
| } | |||
| } | |||
| /// <summary> | |||
| /// 定时器更新btn开关服务器 | |||
| /// </summary> | |||
| private void tmr_Tick(object sender, EventArgs e) | |||
| { | |||
| if (tcpConn.SocketExist) | |||
| btnSerSwitch.Text = "关闭服务器"; | |||
| else | |||
| btnSerSwitch.Text = "开启服务器"; | |||
| } | |||
| private void Server_Load(object sender, EventArgs e) | |||
| { | |||
| @@ -91,11 +87,6 @@ namespace StuMgmServer | |||
| { | |||
| //DialogResult dr = MessageBox.Show("确认退出程序?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); | |||
| //if (dr != DialogResult.Yes) | |||
| //e.Cancel = true; | |||
| //tmr.Dispose(); | |||
| //if (tUpdateUi != null) | |||
| // tUpdateUi.Abort(); | |||
| //if (MessageBox.Show("确认退出程序?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) | |||
| System.Environment.Exit(0); | |||
| } | |||
| @@ -0,0 +1,201 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Data; | |||
| namespace StuMgmClient | |||
| { | |||
| enum ErrCode | |||
| { | |||
| Success, | |||
| FailSerial, | |||
| FailDeserial, | |||
| FailConnect, | |||
| FailSend, | |||
| FailReceive, | |||
| ErrData, | |||
| } | |||
| public enum FuncCode | |||
| { | |||
| VerifLogin = 1, | |||
| GetCourseInfo, | |||
| GetUserCourseInfo, | |||
| } | |||
| public enum Roles | |||
| { | |||
| NotFound = -1, | |||
| Error = -2, | |||
| Admin = 1, | |||
| Teacher = 2, | |||
| Student = 3, | |||
| } | |||
| [Serializable] | |||
| public class ClientRequest | |||
| { | |||
| public FuncCode Func; | |||
| public object Object; | |||
| public ClientRequest(FuncCode func, object obj) | |||
| { | |||
| Func = func; | |||
| Object = obj; | |||
| } | |||
| } | |||
| [Serializable] | |||
| public class UserInfo | |||
| { | |||
| public short Account; // Changed | |||
| public string Password; | |||
| public Int16 Token; | |||
| public Roles UserRole; | |||
| public UserInfo(short account, string password) // Changed | |||
| { | |||
| Account = account; | |||
| Password = password; | |||
| } | |||
| } | |||
| public class CourseInfo | |||
| { | |||
| public short Id; | |||
| public short Pid; | |||
| public int Time; | |||
| public string Name; | |||
| public string Content; | |||
| } | |||
| [Serializable] | |||
| public enum CourseStatusEnum | |||
| { | |||
| lll, | |||
| ...// | |||
| } | |||
| [Serializable] | |||
| public class UserCourseInfo | |||
| { | |||
| public short JobId;//工号 | |||
| public string Name;//姓名 | |||
| ..public DateTime Entry; | |||
| public string InfoDescribe;//信息描述 | |||
| } | |||
| /* | |||
| #region 学生题目信息一览 | |||
| #endregion | |||
| #region 学生单题详细信息 | |||
| public class HistoryInfo | |||
| { | |||
| DateTime Time; | |||
| string Describe; | |||
| } | |||
| public class DetailInfo | |||
| { | |||
| public short CourseId; | |||
| public short JobId; | |||
| List<HistoryInfo> Describes; | |||
| } | |||
| #endregion | |||
| */ | |||
| //[Serializable] | |||
| //public class ServerSend | |||
| //{ | |||
| // public short permission { get; set; } | |||
| // public DataSet ds { get; set; } | |||
| //} | |||
| } | |||
| namespace StuMgmClient | |||
| { | |||
| //class Data | |||
| //{ | |||
| // //状态值字符串转字典 | |||
| // public Dictionary<int, int> StateParsing(DataTable table) | |||
| // { | |||
| // Dictionary<int, int> myDictionary = new Dictionary<int, int>(); | |||
| // ClientMysql cm = new ClientMysql(); | |||
| // DataSet ds = cm.SelectState(); | |||
| // DataRow dr = ds.Tables["user_info"].Rows[0]; | |||
| // string state = dr["course_status"].ToString(); | |||
| // int num = 0; | |||
| // int oldTem = 0; | |||
| // //切割字符串 | |||
| // string[] sArray = state.Split(new char[2] { ':', ';' }); | |||
| // foreach (string i in sArray) | |||
| // { | |||
| // if (i.Equals("")) { break; } | |||
| // int tem = Convert.ToInt32(i); | |||
| // num++; | |||
| // if (num % 2 != 0) | |||
| // { | |||
| // myDictionary.Add(tem, 0); | |||
| // oldTem = tem; | |||
| // } | |||
| // else | |||
| // { | |||
| // myDictionary[oldTem] = tem; | |||
| // } | |||
| // } | |||
| // return myDictionary; | |||
| // } | |||
| // //字典转字符串 | |||
| // public string DicParsing(Dictionary<int, int> dic) | |||
| // { | |||
| // string stateText = ""; | |||
| // foreach (var item in dic) | |||
| // { | |||
| // stateText = stateText + item.Key + ":" + item.Value + ";"; | |||
| // } | |||
| // return stateText; | |||
| // } | |||
| // //查询所有子节点 | |||
| // public void GetAllNodes(string id, DataTable table, ref Dictionary<int, int> nodesDic) | |||
| // { | |||
| // //把父节点的数据筛选出来 | |||
| // DataRow[] rows = table.Select("pid =" + id);//取根 | |||
| // if (rows.Length <= 0) | |||
| // { | |||
| // nodesDic.Add(Convert.ToInt32(id), 0); | |||
| // return; | |||
| // } | |||
| // foreach (DataRow dr in rows) | |||
| // { | |||
| // GetAllNodes(dr["id"].ToString(), table, ref nodesDic); | |||
| // } | |||
| // } | |||
| // //获取所有子节点Dictionary | |||
| // public Dictionary<int, int> GetNodesDic(DataTable table) | |||
| // { | |||
| // Dictionary<int, int> nodesDic = new Dictionary<int, int>(); | |||
| // GetAllNodes("0", table, ref nodesDic); | |||
| // return nodesDic; | |||
| // } | |||
| //} | |||
| } | |||
| @@ -0,0 +1,95 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Diagnostics; | |||
| using System.Net; | |||
| using System.Net.Sockets; | |||
| namespace StuMgmClient | |||
| { | |||
| class SystemComm | |||
| { | |||
| #region 基本函数 | |||
| const int bufSize = 1024 * 1024; | |||
| static IPEndPoint m_ipEndpoint; | |||
| static Socket m_socket; | |||
| static byte[] m_buf; | |||
| internal static void Init(string ip, int port) | |||
| { | |||
| IPAddress ipAdress = IPAddress.Parse(ip); | |||
| m_ipEndpoint = new IPEndPoint(ipAdress, port); | |||
| m_buf = new byte[bufSize]; | |||
| } | |||
| static bool Connect() | |||
| { | |||
| try | |||
| { | |||
| m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||
| m_socket.Connect(m_ipEndpoint); | |||
| return m_socket.Connected; | |||
| } | |||
| catch (Exception ex) | |||
| { | |||
| Debug.Print(ex.Message); | |||
| return false; | |||
| } | |||
| } | |||
| static bool Send(byte[] data) | |||
| { | |||
| try | |||
| { | |||
| m_socket.Send(data); | |||
| return true; | |||
| } | |||
| catch(Exception e) | |||
| { | |||
| Debug.Print(e.Message); | |||
| return false; | |||
| } | |||
| } | |||
| static bool Receive() | |||
| { | |||
| try | |||
| { | |||
| Array.Clear(m_buf, 0, m_buf.Length); | |||
| m_socket.Receive(m_buf); | |||
| return true; | |||
| } | |||
| catch (Exception e) | |||
| { | |||
| Debug.Print(e.Message); | |||
| return false; | |||
| } | |||
| } | |||
| static void DisConnect() | |||
| { | |||
| m_socket.Close(); | |||
| } | |||
| #endregion | |||
| internal static ErrCode GetData(ClientRequest req,out object o) | |||
| { | |||
| o = null; | |||
| if (!Connect()) | |||
| return ErrCode.FailConnect; | |||
| byte[] sendBuf; | |||
| if (!Utility.BinSerialize(req, out sendBuf)) | |||
| return ErrCode.FailSerial; | |||
| if (!Send(sendBuf)) | |||
| return ErrCode.FailSend; | |||
| if (!Receive()) | |||
| return ErrCode.FailReceive; | |||
| DisConnect(); | |||
| if (!Utility.BinDeserialize(m_buf, out o)) | |||
| return ErrCode.FailDeserial; | |||
| return ErrCode.Success; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,88 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace StuMgmClient | |||
| { | |||
| class SystemCtrl | |||
| { | |||
| internal static ErrCode VerifLogin(string userName, string pawssword, out Roles role, out string token) | |||
| { | |||
| role = Roles.Error; | |||
| token = string.Empty; | |||
| UserInfo cs = new UserInfo(userName, pawssword); | |||
| ClientRequest req = new ClientRequest(FuncCode.VerifLogin, cs); | |||
| object o; | |||
| ErrCode err = SystemComm.GetData(req, out o); | |||
| if (err != ErrCode.Success) | |||
| return err; | |||
| if (!(o is UserInfo)) | |||
| return ErrCode.ErrData; | |||
| role = ((UserInfo)o).UserRole; | |||
| token = ((UserInfo)o).Token; | |||
| return ErrCode.Success; | |||
| } | |||
| internal static ErrCode GetCourseInfo(out List<CourseInfo> courseInfo) | |||
| { | |||
| courseInfo = null; | |||
| //****** | |||
| ClientRequest req = new ClientRequest(FuncCode.GetCourseInfo, null); | |||
| object o; | |||
| ErrCode err = SystemComm.GetData(req, out o); | |||
| if (err != ErrCode.Success) | |||
| return err; | |||
| if (!(o is List<CourseInfo>)) | |||
| return ErrCode.ErrData; | |||
| courseInfo = (List<CourseInfo>)o; | |||
| return ErrCode.Success; | |||
| } | |||
| internal static ErrCode RefreshUserCourseInfo(string token) | |||
| { | |||
| UserCourseInfo info; | |||
| ErrCode err; | |||
| err = GetUserCourseInfo(token, out info); | |||
| if (err != ErrCode.Success) | |||
| return err; | |||
| err = SystemData.RefreshUserCourseInfo(info); | |||
| if (err != ErrCode.Success) | |||
| return err; | |||
| return ErrCode.Success; | |||
| } | |||
| static ErrCode GetUserCourseInfo(string token ,out UserCourseInfo info) | |||
| { | |||
| info = null; | |||
| ClientRequest req = new ClientRequest(FuncCode.GetUserCourseInfo, token); | |||
| object o; | |||
| ErrCode err = SystemComm.GetData(req, out o); | |||
| if (err != ErrCode.Success) | |||
| return err; | |||
| if (!(o is UserCourseInfo)) | |||
| return ErrCode.ErrData; | |||
| info = (UserCourseInfo)o; | |||
| return ErrCode.Success; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,40 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace StuMgmClient | |||
| { | |||
| class SystemData | |||
| { | |||
| static Dictionary<short, CourseInfo> allCourseInfo; | |||
| static Dictionary<short,CourseStatusEnum> allCourseStatus; | |||
| internal static ErrCode InitSystemData() | |||
| { | |||
| ErrCode err; | |||
| err = InitCourseInfo(); | |||
| if (err != ErrCode.Success) | |||
| return err; | |||
| return ErrCode.Success; | |||
| } | |||
| static ErrCode InitCourseInfo() | |||
| { | |||
| ErrCode err; | |||
| List<CourseInfo> courseInfo; | |||
| err = SystemCtrl.GetCourseInfo(out courseInfo); | |||
| if (err != ErrCode.Success) | |||
| return err; | |||
| ...//将List<CourseInfo>转为Dictionary<short, CourseInfo> | |||
| return ErrCode.Success; | |||
| } | |||
| internal static ErrCode RefreshUserCourseInfo(UserCourseInfo info) | |||
| { | |||
| ...//将UserCourseInfo转为Dictionary<short,CourseStatusEnum> | |||
| return ErrCode.Success; | |||
| } | |||
| } | |||
| } | |||
| @@ -40,6 +40,7 @@ | |||
| <Reference Include="System.Xml" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <Compile Include="Data.cs" /> | |||
| <Compile Include="Form1.cs"> | |||
| <SubType>Form</SubType> | |||
| </Compile> | |||
| @@ -48,6 +49,9 @@ | |||
| </Compile> | |||
| <Compile Include="Program.cs" /> | |||
| <Compile Include="Properties\AssemblyInfo.cs" /> | |||
| <Compile Include="SystemComm.cs" /> | |||
| <Compile Include="SystemCtrl.cs" /> | |||
| <Compile Include="SystemData.cs" /> | |||
| <EmbeddedResource Include="Form1.resx"> | |||
| <DependentUpon>Form1.cs</DependentUpon> | |||
| </EmbeddedResource> | |||