瀏覽代碼

优化:

Tcp类
控制层复用抽层
Server
Somuns 4 年之前
父節點
當前提交
d5ea41bb41
共有 5 個檔案被更改,包括 250 行新增172 行删除
  1. +24
    -22
      StuMgmServer/StuMgmLib/MyNameSpace/CommonData.cs
  2. +174
    -97
      StuMgmServer/StuMgmLib/MyNameSpace/SystemCtrl.cs
  3. +25
    -30
      StuMgmServer/StuMgmLib/MyNameSpace/TcpConn.cs
  4. +0
    -1
      StuMgmServer/StuMgmServer/Program.cs
  5. +27
    -22
      StuMgmServer/StuMgmServer/Server.cs

+ 24
- 22
StuMgmServer/StuMgmLib/MyNameSpace/CommonData.cs 查看文件

@@ -5,25 +5,40 @@
*/
using System;
using System.Collections.Generic;
using System.Data;

namespace StuMgmLib.MyNameSpace
{
public class Info
#region QuickTable

internal class QTInfo
{
public int Token;
public Lvl Level;
public QTInfo(int token, Lvl lv)
{
Token = token;
Level = lv;
}
}
public class QT // quickTable
{
internal const Int16 tokenMaxCount = 32767;
internal static Dictionary<short, int> myToken = new Dictionary<short, int>();
internal static Dictionary<short, QTInfo> quickTable = new Dictionary<short, QTInfo>();
}

#endregion

#region ClientClass

public enum ClientFunc
{
VerifyLogin = 1,
GetCourseInfo = 2,
GetUserCourseInfo = 3,
GetSelfUserCourseInfo = 3,
GetSomeoneUserCInfo = 6,
SUpdateCourse = 4,
TUpdateCourse = 5,

}
public enum Lvl
{
@@ -65,19 +80,11 @@ namespace StuMgmLib.MyNameSpace
}

[Serializable]
public class UserCourseInfoOper // T represents teacher, S ->student
public class UserCourseInfoOper
{
public short Job_Id;
public int Token;
public string sqlStr;
}


[Serializable]
public enum CourseStatusEnum
{
//lll,
//...//
public string Status;
}


@@ -87,6 +94,8 @@ namespace StuMgmLib.MyNameSpace
[Serializable]
public class ServerResponse
{
public bool Final;
public string ErrMessage;
public object Object;
public ServerResponse(object obj)
{
@@ -100,7 +109,6 @@ namespace StuMgmLib.MyNameSpace
{
public int Token;
public Lvl Level;
public bool Final;
}

[Serializable]
@@ -123,14 +131,8 @@ namespace StuMgmLib.MyNameSpace
public string Details;//信息描述
}

[Serializable]
public class UpdateRp // 数据库操作反馈信息
{
public bool Final;
public string ErrMessge;
#endregion
}

#endregion

}



+ 174
- 97
StuMgmServer/StuMgmLib/MyNameSpace/SystemCtrl.cs 查看文件

@@ -1,17 +1,18 @@
using MySql.Data.MySqlClient;
/* Describtion : Class for Data Operation
* Company : Wuxi Xinje
* Author : Somuns
* DateTime : 2021/1/28
*/
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
public class SystemCtrl
{
#region 流
/// <summary>
@@ -38,7 +39,6 @@ namespace StuMgmLib.MyNameSpace
}
#endregion


/// <summary>
/// 获取返回数据
/// </summary>
@@ -48,83 +48,93 @@ namespace StuMgmLib.MyNameSpace
{
var cr = Deserialize<ClientRequest>(clientRequset);

ServerResponse sr = null;
ServerResponse sr = new ServerResponse(null);

switch (cr.Func)
{
case ClientFunc.VerifyLogin:
UserInfoLogin uil = (UserInfoLogin)cr.Object;
#region 登陆验证
LoginResponse lr = new LoginResponse();
sr = new ServerResponse(lr);
UserInfoLogin login = (UserInfoLogin)cr.Object;

if (getPermission(uil, out lr.Level))
lr.Token = addToken(uil.Account, ref Info.myToken);
getPerFromDB(login, out sr.Final, out sr.ErrMessage, out lr.Level);
if (sr.Final)
lr.Token = addToken(login.Account, lr.Level, ref QT.quickTable);

sr = new ServerResponse(lr);
break;
#endregion
case ClientFunc.GetCourseInfo:

sr = new ServerResponse(getCourseInfo());
Debug.Print(sr.Object.GetType().ToString());
#region 获取课程表
sr.Object = getCosInfo(out sr.Final, out sr.ErrMessage);
break;

case ClientFunc.GetUserCourseInfo: // 获取学员个人课程信息,详情
#endregion
case ClientFunc.GetSelfUserCourseInfo:
#region 学员获取个人进度详情

UserCourseInfoReq ucir = (UserCourseInfoReq)cr.Object;
UserCourseInfo uc = new UserCourseInfo();
sr = new ServerResponse(uc);

if (!verifyToken(ucir.Job_Id, ucir.Token))
vrTokenFrT(ucir.Job_Id, ucir.Token, out sr.Final, out sr.ErrMessage);
if (!sr.Final)
break;

if (getUserCourseStatus(ucir.Job_Id, out uc.Status, out uc.Details))
sr = new ServerResponse(uc);
getUsrCosStatus(ucir.Job_Id, out sr.Final, out sr.ErrMessage, out uc.Status, out uc.Details);
break;

case ClientFunc.SUpdateCourse: // 学生修改课程信息,仅有权修改自己的个别类型状态
/* Todo
verify (jobid token)
update */
UserCourseInfoOper suico = (UserCourseInfoOper)cr.Object;
UpdateRp urs = new UpdateRp();
#endregion
case ClientFunc.GetSomeoneUserCInfo:
#region 教师获取某人进度详情

UserCourseInfoOper uciO = (UserCourseInfoOper)cr.Object;

if (!verifyToken(suico.Job_Id, suico.Token))
vrTokenFrT(uciO.Job_Id, uciO.Token, out sr.Final, out sr.ErrMessage);
if (!sr.Final)
break;

sUpdateInfo(suico.Job_Id, suico.sqlStr, out urs.Final, out urs.ErrMessge);
Lvl l = getPerFrT(uciO.Job_Id);
vrPer(l, out sr.Final, out sr.ErrMessage);
if (!sr.Final)
break;

sr.Object = getUsrCosStatus(uciO.Status, out sr.Final, out sr.ErrMessage);
break;

sr = new ServerResponse(urs);
#endregion
case ClientFunc.SUpdateCourse:
#region 学生修改课程状态

UserCourseInfoOper suico = (UserCourseInfoOper)cr.Object;

vrTokenFrT(suico.Job_Id, suico.Token, out sr.Final, out sr.ErrMessage);
if (!sr.Final)
break;

sUpUsrCosInfo(suico.Job_Id, suico.Status, out sr.Final, out sr.ErrMessage);
break;

#endregion
case ClientFunc.TUpdateCourse:
/*Todo
教师修改课程信息,有权更改学生课程状态
verify (jobid,token)
verify(permission)
update*/
UserCourseInfoOper tucio = (UserCourseInfoOper)cr.Object;
UpdateRp urt = new UpdateRp();
#region 教师修改课程详情

if (!verifyToken(tucio.Job_Id, tucio.Token))
break;
UserCourseInfoOper tucio = (UserCourseInfoOper)cr.Object;

Lvl l = Lvl.Error;
if (!getPermission(tucio.Job_Id, out l))
vrTokenFrT(tucio.Job_Id, tucio.Token, out sr.Final, out sr.ErrMessage);
if (!sr.Final)
break;

if (!(l == Lvl.Teacher || l == Lvl.Teacher))
{
urt.Final = false;
urt.ErrMessge = "permission err";
Lvl lv = getPerFrT(tucio.Job_Id);
vrPer(lv, out sr.Final, out sr.ErrMessage);
if (!sr.Final)
break;
}

tUpdateInfo(tucio.sqlStr, out urt.Final, out urt.ErrMessge);
sr = new ServerResponse(urt);
tUpUsrCosInfo(tucio.Status, out sr.Final, out sr.ErrMessage);

break;
#endregion
}
if (null == sr)
return null;

return Serialize<ServerResponse>(sr);
}
catch
@@ -135,24 +145,16 @@ namespace StuMgmLib.MyNameSpace

const string conStr = "data source=localhost; initial catalog=xinje; user id=root; pwd=980505;charset = utf8";

#region Verify
#region Token、Permission

static bool getPermission(object o, out Lvl level)
static void getPerFromDB(UserInfoLogin o, out bool final, out string errMessage, out Lvl level)
{
final = false;
level = Lvl.Error;
errMessage = null;

string qStu = "select * from user where account = ";

if (o is UserInfoLogin)
{
UserInfoLogin uil = (UserInfoLogin)o;
qStu += uil.Account + " and password = '" + uil.Password + "'";
} // 首次登陆验证
else if (o is UserCourseInfoOper)
{
UserCourseInfoOper ucio = (UserCourseInfoOper)o;
qStu += ucio.Job_Id + ucio.sqlStr;
} // 数据库操作验证权限
qStu += o.Account + " and password = '" + o.Password + "'";

MySqlConnection con = new MySqlConnection(conStr);
try
@@ -164,17 +166,19 @@ namespace StuMgmLib.MyNameSpace
{
mReader.Read();
level = (Lvl)mReader.GetInt16("level");
return true;
final = true;
}
else
{
level = Lvl.NotFound;
return false;
final = false;
}
}
catch (MySqlException)
catch (MySqlException e)
{
return false;
errMessage = e.Message;
final = false;
Debug.Print(DateTime.Now + " : " + e.Message);
}
finally
{
@@ -182,11 +186,11 @@ namespace StuMgmLib.MyNameSpace
}
}

static int addToken(short job_id, ref Dictionary<short, int> myToken)
static int addToken(short job_id, Lvl level, ref Dictionary<short, QTInfo> myToken)
{
if (myToken != null)
{
if (myToken.Count > Info.tokenMaxCount) // 清除缓存
if (myToken.Count > QT.tokenMaxCount) // 清除缓存
myToken.Clear();
if (myToken.ContainsKey(job_id))
{
@@ -195,24 +199,54 @@ namespace StuMgmLib.MyNameSpace
}
Random r = new Random(); // 伪随机
int token = r.Next();
myToken.Add(job_id, token);

QTInfo u = new QTInfo(token, level);

myToken.Add(job_id, u);
return token;
}

static bool verifyToken(short job_id, int token)
static void vrTokenFrT(short job_id, int token, out bool final, out string errMessage)
{
final = false;
errMessage = null;
if (QT.quickTable[job_id].Token != token)
{
errMessage = "Token Err";
return;
}
final = true;
}

static Lvl getPerFrT(short job_id)
{
return QT.quickTable[job_id].Level;
}

static void vrPer(Lvl lv, out bool final, out string errMessage)
{
if (Info.myToken[job_id] == token)
return true;
return false;
if (!(lv == Lvl.Teacher || lv == Lvl.Admin))
{
final = false;
errMessage = "Permission denied";
}
final = true;
errMessage = null;
}

#endregion

#region GetInfo

// Common
#region CourseInfo
const int nameColumn = 1;
const int contentColumn = 3;
static List<CourseInfo> getCourseInfo()
static List<CourseInfo> getCosInfo(out bool final, out string errMessage)
{
final = false;
errMessage = null;

List<CourseInfo> listCI = new List<CourseInfo>();
string str = "select * from course_info";
MySqlConnection con = new MySqlConnection(conStr);
@@ -231,10 +265,12 @@ namespace StuMgmLib.MyNameSpace
ci.Content = (mReader.IsDBNull(contentColumn)) ? "无" : mReader.GetString("content");
listCI.Add(ci);
}
final = true;
return listCI;
}
catch (MySqlException mySqlEx)
{
errMessage = mySqlEx.Message;
Debug.Print(DateTime.Now + " : " + mySqlEx.Message);
return null;
}
@@ -248,12 +284,13 @@ namespace StuMgmLib.MyNameSpace
#region UserCourseInfo
const int statusColumn = 3;
const int detailsColumn = 4;

/// <summary>
/// 员工获取课程信息
/// 员工获取课程详情
/// </summary>
static bool getUserCourseStatus(short jobId, out string status, out string details)
static void getUsrCosStatus(short jobId, out bool final, out string errMessage, out string status, out string details)
{
final = false;
errMessage = null;
status = "";
details = "";
string qStu = "select * from usercouse_info where job_id = " + jobId;
@@ -266,17 +303,59 @@ namespace StuMgmLib.MyNameSpace
mReader.Read();
status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status");
details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details");
return true;
final = true;
}
catch (MySqlException MySqlE)
{
errMessage = MySqlE.Message;
Debug.Print(DateTime.Now + " : " + MySqlE.Message);
}
finally
{
con.Close();
}
}
/// <summary>
/// 教师获取课程详情
/// </summary>
static List<UserCourseInfo> getUsrCosStatus(string sqlStr, out bool final, out string errMessage)
{
List<UserCourseInfo> list = new List<UserCourseInfo>();
final = false;
errMessage = null;

string qStu = "select * from usercouse_info where";
qStu += sqlStr;
MySqlConnection con = new MySqlConnection(conStr);
try
{
con.Open();
MySqlCommand mCmd = new MySqlCommand(qStu, con);
MySqlDataReader mReader = mCmd.ExecuteReader();
UserCourseInfo u = new UserCourseInfo();
while (mReader.Read())
{
u.JobId = mReader.GetInt16("job_id");
u.Name = mReader.GetString("name");
u.Status = (mReader.IsDBNull(statusColumn)) ? " " : mReader.GetString("status");
u.Details = (mReader.IsDBNull(detailsColumn)) ? " " : mReader.GetString("details");
list.Add(u);
}
final = true;
return list;
}
catch (MySqlException)
catch (MySqlException MySqlE)
{
return false;
errMessage = MySqlE.Message;
Debug.Print(DateTime.Now + " : " + MySqlE.Message);
return null;
}
finally
{
con.Close();
}
}
#endregion

#endregion

@@ -287,26 +366,27 @@ namespace StuMgmLib.MyNameSpace
/// <summary>
/// 学员更改个人课程状态
/// </summary>
static void sUpdateInfo(short job_id, string sqlStr, out bool final, out string eMessage)
static void sUpUsrCosInfo(short job_id, string sqlStr, out bool final, out string eMessage)
{
final = false;
eMessage = null;
string str = "select * from usercourse_info where account = " + job_id + sqlStr;
MySqlConnection conn = new MySqlConnection();
string str = "UPDATE usercouse_info " + " set status = '" + sqlStr + "' where job_id = " + job_id;
MySqlConnection con = new MySqlConnection(conStr);
try
{
MySqlCommand cmd = new MySqlCommand(str, conn);
con.Open();
MySqlCommand cmd = new MySqlCommand(str, con);
if (cmd.ExecuteNonQuery() > 0)
final = true;
}
catch (MySqlException e)
catch (MySqlException MySqlE)
{
eMessage = e.Message;
Debug.Print(e.Message); // 可以去掉
eMessage = MySqlE.Message;
Debug.Print(DateTime.Now + " : " + MySqlE.Message);
}
finally
{
conn.Close();
con.Close();
}
}

@@ -314,10 +394,11 @@ namespace StuMgmLib.MyNameSpace

#region Teacher

static void tUpdateInfo(string sqlStr, out bool final, out string eMessage)
static void tUpUsrCosInfo(string sqlStr, out bool final, out string eMessage)
{
final = false;
eMessage = null;

string str = "select * from usercourse_info where " + sqlStr;
MySqlConnection conn = new MySqlConnection();
try
@@ -326,10 +407,10 @@ namespace StuMgmLib.MyNameSpace
if (cmd.ExecuteNonQuery() > 0)
final = true;
}
catch (MySqlException e)
catch (MySqlException MySqlE)
{
eMessage = e.Message;
Debug.Print(e.Message); // 可以去掉
eMessage = MySqlE.Message;
Debug.Print(DateTime.Now + " : " + MySqlE.Message);
}
finally
{
@@ -343,9 +424,5 @@ namespace StuMgmLib.MyNameSpace

#endregion



}


}

+ 25
- 30
StuMgmServer/StuMgmLib/MyNameSpace/TcpConn.cs 查看文件

@@ -11,13 +11,13 @@ using System.Windows.Forms;

namespace StuMgmLib.MyNameSpace
{
// 还有一种验证连接方式: Token
public class TcpConn
{
public EndPoint Ep;
private IPEndPoint ipp = null;
private Socket socket = null;
private Socket socketClient = null;
public Socket socketClient;

private IPEndPoint ipp;
private Socket socket;

private bool my_SocketExist = false;
/// <summary>
@@ -43,7 +43,9 @@ namespace StuMgmLib.MyNameSpace
cb.Items.Add("127.0.0.1");
}

#region 开启服务器
/// <summary>
/// 开服务器
/// </summary>
public void OpenServer(string ipAddr, int port)
{
ipp = new IPEndPoint(IPAddress.Parse(ipAddr), port);
@@ -52,20 +54,19 @@ namespace StuMgmLib.MyNameSpace
socket.Listen(0);
SocketExist = true;
}
#endregion

#region 关闭服务器
/// <summary>
/// 关服务器
/// </summary>
public void CloseServer()
{
SocketExist = false;
if (socketClient != null)
socketClient.Close();
if (socket != null)
socket.Close();
SocketExist = false;
}
#endregion

#region 接收客户端连接
/// <summary>
/// 接收客户端连接
/// </summary>
@@ -78,43 +79,37 @@ namespace StuMgmLib.MyNameSpace
}
catch (SocketException se)
{
Debug.Print(se.Message);
Debug.Print(DateTime.Now + " : " + se.Message);
}
}
#endregion

const int recvTimeOut = -1; // 设置接收超时时间
private int recvTimeOut = 2000;
public int RecvTimeOut // 设置接收超时时间
{
get { return recvTimeOut; }
set { recvTimeOut = value; }
}
const int recvLength = 65535;
#region 接收数据
/// <summary>
/// 接收数据
/// </summary>
public void AcpMsg()
public byte[] AcceptMsg()
{
byte[] clientSend = new byte[recvLength]; // 定义接收数组
byte[] clientSend = new byte[recvLength];
try
{

socketClient.ReceiveTimeout = recvTimeOut;
socketClient.ReceiveTimeout = RecvTimeOut;
socketClient.Receive(clientSend);

byte[] serverSend = SystemCtrl.CreateServerResponse(clientSend);

if (serverSend != null)
socketClient.Send(serverSend);

}
catch (SocketException se) // 客户端断开连接
{
Debug.Print(se.Message);
return clientSend;
}
finally
catch (Exception e) // 客户端断开连接
{
Debug.Print(DateTime.Now + " : " + e.Message);
if (socketClient != null)
socketClient.Close();
return null;
}
}
#endregion

}
}

+ 0
- 1
StuMgmServer/StuMgmServer/Program.cs 查看文件

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace StuMgmServer


+ 27
- 22
StuMgmServer/StuMgmServer/Server.cs 查看文件

@@ -2,6 +2,7 @@
using System.Threading;
using System.Windows.Forms;
using StuMgmLib.MyNameSpace;
using System.Diagnostics;

namespace StuMgmServer
{
@@ -19,9 +20,8 @@ namespace StuMgmServer
{
tcpConn.GetIPAddress(cbxIPAddr);
}
/// <summary>
/// 委托:更新界面方法
/// </summary>

// 委托:更新界面
private void setText(string text)
{
if (rtxHistory.InvokeRequired)
@@ -35,9 +35,7 @@ namespace StuMgmServer
}
}

/// <summary>
/// btn开关点击事件:开启、关闭服务器
/// </summary>
// 开启、关闭服务器
private void btnSerSwitch_Click(object sender, EventArgs e)
{
bool sFlag = tcpConn.SocketExist;
@@ -63,21 +61,28 @@ namespace StuMgmServer
}
}

/// <summary>
/// 线程:接收客户端连接,接收数据,数据处理;更新历史界面
/// </summary>
// 线程:接收客户端连接,接收数据,数据处理;更新历史界面
private void updateHistory()
{
while (tcpConn.SocketExist)
{
tcpConn.AcceptConn();
setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 建立连接 \n");
tcpConn.AcpMsg();
setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 断开连接 \n");
try
{
tcpConn.AcceptConn();
setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 建立连接 \n");
byte[] serverSend = SystemCtrl.CreateServerResponse(tcpConn.AcceptMsg());
if (serverSend != null)
tcpConn.socketClient.Send(serverSend);
tcpConn.socketClient.Close();
setText(DateTime.Now.ToLongTimeString() + " : " + tcpConn.Ep.ToString() + " 断开连接 \n");
}
catch (Exception e)
{
Debug.Print(DateTime.Now + " : " + e.Message);
}
}
}


private void Server_Load(object sender, EventArgs e)
{
tcpConn.GetIPAddress(cbxIPAddr);
@@ -85,15 +90,15 @@ namespace StuMgmServer

private void Server_FormClosing(object sender, FormClosingEventArgs e)
{
//DialogResult dr = MessageBox.Show("确认退出程序?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
//if (dr != DialogResult.Yes)
System.Environment.Exit(0);

DialogResult dr = MessageBox.Show("确认退出程序?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dr != DialogResult.Yes)
e.Cancel = true;
else
{
if (tUpdateUi != null)
tUpdateUi.Abort();
}
}





}
}

Loading…
取消
儲存