@@ -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> | |||