/// <summary> /// 学生手机客户端计时请求 /// </summary> /// <param name="studentClient">学生手机客户端</param> /// <param name="stuId">学号</param> /// <param name="keepTime">持续计时时间</param> private void timeReq(attendanceServerSocket studentClient, string stuId, int keepTime) { JObject timeRsp = new JObject(); timeRsp.Add("type", "timeRsp"); int score = (int)(((float)keepTime / (float)attendanceServerInfo.getAttendanceServerInfo().getStartServerInterval()) * (float)100); if (score >= 100) { score = 100; } mysqlImp.getMysql().update("update timeattendance set score=" + score + ",keepTime = " + keepTime + " where stuId='" + stuId + "'"); DataTable table = mysqlImp.getMysql().showTable("select keepTime,score from timeattendance where stuId='" + stuId + "'"); timeRsp.Add("keepTime", aesImp.getAesImp().encrypt( table.Rows[0]["keepTime"].ToString(), attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); timeRsp.Add("score", aesImp.getAesImp().encrypt( table.Rows[0]["score"].ToString(), attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); mysqlImp.getMysql().update("update timeattendance set allcore = score + ecore where stuId='" + stuId + "'"); mysqlImp.getMysql().update("update timeattendance set allcore = 100 where allcore > 100 and stuId='" + stuId + "'"); mysqlImp.getMysql().update("update timeattendance set allcore = 0 where allcore < 0 and stuId='" + stuId + "'"); studentClient.sendMsg(timeRsp.ToString()); }
/// <summary> /// 连接回复 /// </summary> /// <param name="studentClient">学生手机客户端对象</param> public void connRsp(attendanceServerSocket studentClient) { JObject connRsp = new JObject(); connRsp.Add("type", "connRsp"); connRsp.Add("randomKey", attendanceServerInfo.getAttendanceServerInfo().getRandomKey()); connRsp.Add("attendanceType", loadStudentListInfo.getLoadStudent().getAttendanceType().ToString()); attendanceInfo.getAttendance().getStartCheck().showServerReceive("发送数据给客户端:" + connRsp.ToString()); studentClient.sendMsg(connRsp.ToString()); }
/// <summary> /// 学生手机客户端消息管理 /// </summary> /// <param name="studentClient">学生手机客户端对象</param> /// <param name="messageStr">客户端发送给服务端的消息</param> public void messageManager(attendanceServerSocket studentClient, string messageStr) { JObject reqMessage = JObject.Parse(messageStr); switch (reqMessage["type"].ToString()) { case "signReq": { string stuId = aesImp.getAesImp().decrypt( reqMessage["stuId"].ToString(), attendanceServerInfo.getAttendanceServerInfo().getRandomKey()); string stuTele = aesImp.getAesImp().decrypt( reqMessage["stuTele"].ToString(), attendanceServerInfo.getAttendanceServerInfo().getRandomKey()); string stuMac = aesImp.getAesImp().decrypt( reqMessage["stuMac"].ToString(), attendanceServerInfo.getAttendanceServerInfo().getRandomKey()); signStudent(studentClient, stuId, stuTele, stuMac); } break; case "timeReq": { // keepTime save and calculate classCore string stuId = aesImp.getAesImp().decrypt( reqMessage["stuId"].ToString(), attendanceServerInfo.getAttendanceServerInfo().getRandomKey()); int keepTime = Convert.ToInt32(aesImp.getAesImp().decrypt( reqMessage["keepTime"].ToString(), attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); timeReq(studentClient, stuId, keepTime); } break; default: break; } }
/// <summary> /// 服务端线程 /// </summary> private void attendanceServerThread() { setCurrentTime(); saveServerKey(); Socket serverSocket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint( IPAddress.Parse(serverInfo.getServerInfo().getServerIP()), serverInfo.getServerInfo().getServerPort() )); formInfo.getFormInfo().getForm_attendance().setCurrentInterval(); try { serverSocket.Listen(3000); // 最大监听客户端数量 formInfo.getFormInfo().getForm_attendance().startCheck(); attendanceInfo.getAttendance().getStartCheck().showServerReceive("服务端启动成功"); } catch (Exception ex) { Console.WriteLine("服务端启动失败:" + ex.ToString()); } if (serverSocket.IsBound) { while (true) { Socket client = serverSocket.Accept(); attendanceInfo.getAttendance().getStartCheck().showServerReceive("发现客户端 :" + client.RemoteEndPoint); attendanceServerSocket attendanceSocket = new attendanceServerSocket(client); new Thread(new ThreadStart(attendanceSocket.receiveMsg)).Start(); attendanceServerManager.getManager().addStudentClient(attendanceSocket); } } }
/// <summary> /// 查出学生手机客户端对象 /// </summary> /// <param name="studentClient">学生手机客户端对象</param> public void removeStudentClient(attendanceServerSocket studentClient) { studentClientList.Remove(studentClient); }
/// <summary> /// 更新学生手机客户端对象 /// </summary> /// <param name="studentClient">学生手机客户端对象</param> /// <param name="stuId">学号</param> public void updateStudentClient(attendanceServerSocket studentClient, string stuId) { studentClientList[studentClient] = stuId; }
/// <summary> /// 添加学生手机客户端对象 /// </summary> /// <param name="studentClient">学生手机客户端对象</param> public void addStudentClient(attendanceServerSocket studentClient) { studentClientList.Add(studentClient, ""); connRsp(studentClient); }
/// <summary> /// 学生签到 /// </summary> /// <param name="studentClient">学生手机客户端对象</param> /// <param name="stuId">学生学号</param> /// <param name="stuTele">学生手机号码</param> /// <param name="stuMac">学生手机MAC地址</param> private void signStudent(attendanceServerSocket studentClient, string stuId, string stuTele, string stuMac) { JObject signRsp = new JObject(); signRsp.Add("type", "signRsp"); if (checkStudentExist(stuId)) { if (checkStudentSign(stuId)) { // 检测该学号已经签到过了 if (loadStudentListInfo.getLoadStudent().getAttendanceType()) { // 检测考勤模式处于计时模式 if (checkStudentTeleInfo(stuId, stuTele, stuMac)) { // 回复计时 returnTime(stuId, signRsp); signRsp.Add("returnType", "2"); } else { // 回复计时失败,原因:该学号的手机号码和手机MAC信息与签到时的信息不一致 signRsp.Add("result", aesImp.getAesImp().encrypt( "该学号的手机号码和手机MAC信息与签到时的信息不一致", attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); signRsp.Add("returnType", "0"); } } else { // 检测考勤模式处于签到模式,签到失败:该学号已经签到过了 signRsp.Add("result", aesImp.getAesImp().encrypt( "该学号已经签到过了", attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); signRsp.Add("returnType", "0"); } } else { // 检测该学号没有签到 if (checkStudentTele(stuTele)) { // 检测该手机号码已经被使用 signRsp.Add("result", aesImp.getAesImp().encrypt( "该手机号码已经被使用", attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); signRsp.Add("returnType", "0"); } else { // 该手机号码没被使用 if (checkStudentMac(stuMac)) { // 检测该手机设备已经被使用 signRsp.Add("result", aesImp.getAesImp().encrypt( "该手机设备已经被使用", attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); signRsp.Add("returnType", "0"); } else { // 检测该手机设备没有被使用 // 学生签到 sign(stuId, stuTele, stuMac); if (loadStudentListInfo.getLoadStudent().getAttendanceType()) { signRsp.Add("result", aesImp.getAesImp().encrypt( "签到成功,请认真上课", attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); } else { signRsp.Add("result", aesImp.getAesImp().encrypt( "签到成功,计时过程请关闭屏幕并认真上课", attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); } signRsp.Add("interval", aesImp.getAesImp().encrypt( attendanceServerInfo.getAttendanceServerInfo().getStartServerInterval().ToString() , attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); signRsp.Add("returnType", "1"); updateStudentClient(studentClient, stuId); if (!loadStudentListInfo.getLoadStudent().getAttendanceType()) { mysqlImp.getMysql().update("update signattendance set allcore = score + ecore where stuId='" + stuId + "'"); mysqlImp.getMysql().update("update signattendance set allcore = 100 where allcore > 100 and stuId='" + stuId + "'"); mysqlImp.getMysql().update("update signattendance set allcore = 0 where allcore < 0 and stuId='" + stuId + "'"); } } } } } else { signRsp.Add("result", aesImp.getAesImp().encrypt( "学号不存在,请重新输入学号", attendanceServerInfo.getAttendanceServerInfo().getRandomKey())); } studentClient.sendMsg(signRsp.ToString()); attendanceInfo.getAttendance().getStartCheck().showServerReceive(signRsp.ToString()); }