Skip to content

Commit

Permalink
第二次提交
Browse files Browse the repository at this point in the history
  • Loading branch information
Mintha-Li committed Dec 23, 2022
1 parent b55923e commit 3aa367a
Show file tree
Hide file tree
Showing 32 changed files with 401 additions and 103 deletions.
17 changes: 9 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
# 基于TCP/IP协议的网络计算器

计算机通讯技术课程大作业,使用MFC进行制作
计算机通讯技术课程大作业,基于MFC及套接字进行制作

## 实现功能

- [ ] 运行于具有Windows操作系统的计算机;
- [x] 运行于具有Windows操作系统的计算机;

- [ ] 网络计算器由客户端和服务端构成,客户端和服务端之间的数据通信基于TCP/IP协议;
- [x] 网络计算器由客户端和服务端构成,客户端和服务端之间的数据通信基于TCP/IP协议;

- [ ] 网络计算器能完成由加、减、乘、除、括号和数字构成的复杂算式的计算(也可以只完成简单算式);
- [x] 网络计算器能完成由加、减、乘、除、括号和数字构成的复杂算式的计算(也可以只完成简单算式);

- [ ] 算式的计算操作由服务端完成,算式的输入和计算结果显示由客户端完成;
- [x] 算式的计算操作由服务端完成,算式的输入和计算结果显示由客户端完成;

- [ ] 服务端可以同时为多个客户端服务,服务的客户端个数取决于运行服务端平台的性能;(不强制,也可以是有限的)
- [x] 服务端可以同时为多个客户端服务,服务的客户端个数取决于运行服务端平台的性能;(不强制,也可以是有限的)

- [ ] 客户端在申请服务端的服务时,必须使用事先申请的用户名和密码登陆到服务端;
- [x] 客户端在申请服务端的服务时,必须使用事先申请的用户名和密码登陆到服务端;

- [x] 服务端受到一个合法的客户端服务请求时,都要检查客户端点的费用是否为负或零,若是,服务端点拒绝为其服务,并自动关闭与客户端点的通信通道;若不是,完成服务后扣除相应客户端点的一定费用;(但是不能为客户端服务时,必须给客户端必要的提示)(正在制作ing)

- [ ] 服务端受到一个合法的客户端服务请求时,都要检查客户端点的费用是否为负或零,若是,服务端点拒绝为其服务,并自动关闭与客户端点的通信通道;若不是,完成服务后扣除相应客户端点的一定费用;(但是不能为客户端服务时,必须给客户端必要的提示)
69 changes: 66 additions & 3 deletions client/ClientDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "LoginDlg.h"
#include "ChargeDlg.h"
#include "RegisterDlg.h"
#include "UserData.h"

#ifdef _DEBUG
#define new DEBUG_NEW
Expand Down Expand Up @@ -101,6 +102,9 @@ BEGIN_MESSAGE_MAP(CClientDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_CHARGE, &CClientDlg::OnBnClickedButtonCharge)
ON_COMMAND(ID_CHARGE, &CClientDlg::OnCharge)
ON_BN_CLICKED(IDC_BUTTON_EQUAL, &CClientDlg::OnBnClickedButtonEqual)
ON_COMMAND(ID_USERDATA, &CClientDlg::OnUserdata)
ON_WM_CLOSE()
ON_COMMAND(ID_LOGOUT, &CClientDlg::OnLogOut)
END_MESSAGE_MAP()


Expand Down Expand Up @@ -483,11 +487,14 @@ void CClientDlg::OnCharge()
void CClientDlg::OnChargeSuccess(DOUBLE chargeVal)
{
m_value.Format(L"%.2f", (_ttof(m_value) + chargeVal));
AfxMessageBox(L"充值成功!");
AfxMessageBox(L"充值成功!",MB_ICONINFORMATION);
ChargeDlg->RefreshUserVal();
m_editValue.SetWindowTextW(m_value);
}

void CClientDlg::OnChargeFail()
{
}

void CClientDlg::MsgSend(CString username, CString userPassword, CString textSend, UINT nRequest, UINT nStatus)
{
Expand All @@ -503,10 +510,8 @@ void CClientDlg::ChargeVal(DOUBLE chargeVal)
MsgSend(m_account, m_password, strChargeVal, REQUEST_CHARGE);
}


void CClientDlg::OnBnClickedButtonEqual()
{
// TODO: 在此添加控件通知处理程序代码
MsgSend(m_account, m_password, m_strDisplay, REQUEST_CALCULATE);
}

Expand All @@ -518,3 +523,61 @@ void CClientDlg::OnCalculateSuccess(CString result)
strMsg.Format(L"计算成功,结果:%s", result);
MessageBox(strMsg, L"提示", MB_ICONINFORMATION);
}

void CClientDlg::OnCalculateFail()
{
MessageBox(L"余额不足!", L"提示", MB_ICONINFORMATION);
}


void CClientDlg::OnUserdata()
{
// TODO: 在此添加命令处理程序代码
UserDataDlg = new CUserData(this);
UserDataDlg->DoModal();
}

void CClientDlg::OnUserValueChange(DOUBLE value)
{
CString strValue;
strValue.Format(L"%.2f", value);
m_value = strValue;
m_editValue.SetWindowTextW(CString(m_value));
}

void CClientDlg::OnUserDataChange(CString password)
{
MsgSend(m_account, m_password, password, REQUEST_USERDATA);
OnLogOut();
}

void CClientDlg::OnLogOut()
{
MsgSend(m_account, m_password, L"", REQUSET_QUIT);
ReStart();
}

void CClientDlg::ReStart()
{
wchar_t strPath[100];
GetModuleFileName(NULL, strPath, 100);
//创建守护进程,在启用新进程成功后发送WM_QUIT消息结束原来的进程;
STARTUPINFO startInfo;
PROCESS_INFORMATION processInfo;
ZeroMemory(&startInfo, sizeof(STARTUPINFO));
startInfo.cb = sizeof(STARTUPINFO);
if (CreateProcess(NULL, (LPTSTR)(LPCTSTR)strPath, NULL, NULL, FALSE, 0, NULL, NULL, &startInfo, &processInfo))
{
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
PostQuitMessage(WM_CLOSE);
}
}

void CClientDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
MsgSend(m_account, m_password, L"", REQUSET_QUIT);
CDialogEx::OnClose();
}

36 changes: 21 additions & 15 deletions client/ClientDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class CSocketClient;
class CSetUpDlg;
class CLoginDlg;
class CChargeDlg;
class CUserData;
// CClientDlg 对话框
class CClientDlg : public CDialogEx
{
Expand Down Expand Up @@ -36,7 +37,6 @@ class CClientDlg : public CDialogEx
public:
// 数据的显示
afx_msg void OnStnClickedDisplay();

// 按键
afx_msg void OnBnClickedButtonAC();
afx_msg void OnBnClickedButton0();
Expand All @@ -58,43 +58,39 @@ class CClientDlg : public CDialogEx
afx_msg void OnBnClickedButtonMcl();
afx_msg void OnBnClickedButtonDiv();
afx_msg void OnBnClickedButtonEqual();

// 其他功能按键
afx_msg void OnBnClickedButtonCharge();

public:
// 自定义消息响应
afx_msg LRESULT OnLogin(WPARAM, LPARAM);
afx_msg LRESULT OnRegister(WPARAM, LPARAM);

public:
// 初始化函数
afx_msg void InitSocketClient();
afx_msg void ShowLoginDlg();

public:
// 算式显示部分
// 显示编辑框
CEdit m_editDisplay;
// 显示文本
CString m_strDisplay;

public:
// 用户信息
CString m_account;
CString m_password;
CString m_value;
DOUBLE m_chargeValue;

public:
// Socket
CSocketClient *m_ptrSocketClient;
CString m_IPAddress;
UINT m_Port;

public:
CSetUpDlg *SetUpDlg;
CLoginDlg *LoginDlg;
CChargeDlg *ChargeDlg;


public:
afx_msg void OnSetUp();

// 菜单按键
afx_msg void OnAbout();

// 格式化发送数据生成函数
Expand All @@ -106,15 +102,25 @@ class CClientDlg : public CDialogEx

CEdit m_editValue;
CEdit m_editAccount;
void MsgSend(CString username, CString userPassword, CString textSend = L"0", UINT nRequest = REQUEST_NONE, UINT nStatus = STATUS_NONE);
void MsgSend(CString username, CString userPassword, CString textSend = L"0",
UINT nRequest = REQUEST_NONE, UINT nStatus = STATUS_NONE);
void ChargeVal(DOUBLE chargeVal);

void OnLoginSuccess();
void OnLoginFail();
void OnRegisterSuccess();
void OnRegisterFail();
void OnChargeSuccess(DOUBLE chargeVal);
//void OnChargeFail();
void OnChargeFail();
void OnCalculateSuccess(CString result);
//void OnCalculateFail();
void OnCalculateFail();
public:
CUserData *UserDataDlg;
afx_msg void OnUserdata();
void OnUserValueChange(DOUBLE value);
void OnUserDataChange(CString password);
afx_msg void OnLogOut();
void ReStart();
afx_msg void OnClose();

};
32 changes: 20 additions & 12 deletions client/LoginDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ IMPLEMENT_DYNAMIC(CLoginDlg, CDialogEx)
CLoginDlg::CLoginDlg(CClientDlg *pDlg,CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_LOGIN, pParent)
{
pMainDlg = pDlg;
pMainDlg = pDlg; //将主窗口句柄传入
}

CLoginDlg::~CLoginDlg()
Expand Down Expand Up @@ -46,7 +46,6 @@ BOOL CLoginDlg::OnInitDialog()
CDialogEx::OnInitDialog();
this->ModifyStyleEx(0, WS_EX_APPWINDOW);

// TODO: 在此添加额外的初始化
staticTitleFont.CreatePointFont(150, _T("楷体"));
m_staticTitle.SetFont(&staticTitleFont);

Expand All @@ -57,7 +56,6 @@ BOOL CLoginDlg::OnInitDialog()

void CLoginDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// 若关闭登录窗口,程序应退出
if (MessageBox(L"确认退出?", L"提示", MB_YESNO | MB_ICONINFORMATION) == IDYES)
{
Expand All @@ -70,35 +68,45 @@ void CLoginDlg::OnClose()

void CLoginDlg::OnBnClickedButtonLogin()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
CString m_acct;
CString m_pw;
m_editAccount.GetWindowTextW(m_acct);
m_editPassword.GetWindowTextW(m_pw);
CClientDlg *pParent = (CClientDlg*)GetParent();
pParent->m_account=m_acct;
pParent->m_password = m_pw;
m_editAccount.GetWindowTextW(m_acct); //获取用户名
m_editPassword.GetWindowTextW(m_pw); //获取密码
CClientDlg *pParent = (CClientDlg*)GetParent(); //获取主窗口句柄
pParent->m_account=m_acct; //将用户名和密码传入主窗口
pParent->m_password = m_pw;
//发送自定义消息,主窗口执行实现登录
::SendMessage(::AfxGetMainWnd()->m_hWnd, WM_LOGIN, 0, 0);
}


void CLoginDlg::OnBnClickedButtonRegistor()
{
// TODO: 在此添加控件通知处理程序代码
RegistorDlg = new CRegisterDlg;
RegistorDlg->DoModal();
}


void CLoginDlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
AfxMessageBox(L"登陆成功!");
MessageBox(L"登陆成功!",L"提示",MB_ICONINFORMATION);
CDialogEx::OnOK();
}

void CLoginDlg::CloseRegistorDlg()
{
RegistorDlg->OnOK();
}


BOOL CLoginDlg::PreTranslateMessage(MSG* pMsg)
{
// 修改Enter定义
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
OnBnClickedButtonLogin();
return TRUE;
}
return CDialogEx::PreTranslateMessage(pMsg);
}
2 changes: 1 addition & 1 deletion client/LoginDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
// CLogin 对话框
class CRegisterDlg;
class CClientDlg;
class CRegisterDlg;
class CLoginDlg : public CDialogEx
{
DECLARE_DYNAMIC(CLoginDlg)
Expand Down Expand Up @@ -37,4 +36,5 @@ class CLoginDlg : public CDialogEx
virtual void OnOK();
CRegisterDlg *RegistorDlg;
void CloseRegistorDlg();
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
17 changes: 15 additions & 2 deletions client/RegisterDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ BOOL CRegisterDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// TODO: 在此添加额外的初始化
staticTitleFont.CreatePointFont(150, _T("楷体"));
m_staticTitle.SetFont(&staticTitleFont);

Expand All @@ -65,20 +64,34 @@ void CRegisterDlg::OnBnClickedButtonRst()
m_editPwCheck.GetWindowTextW(m_pwcheck);
CClientDlg *pParent = (CClientDlg*)(AfxGetMainWnd());
if (m_pw == m_pwcheck) {
//若两次密码一致,则发送给主窗口执行注册操作
pParent->m_account = m_acct;
pParent->m_password = m_pw;
::SendMessage(::AfxGetMainWnd()->m_hWnd, WM_REGISTER, 0, 0);
}
else
{
//若两次密码不一致,则进行提示
MessageBox(L"两次输入的密码不一致!", L"提示", MB_OK | MB_ICONERROR);
}
}


void CRegisterDlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
MessageBox(L"注册成功!", L"提示", MB_ICONINFORMATION);
CDialogEx::OnOK();
}


BOOL CRegisterDlg::PreTranslateMessage(MSG* pMsg)
{
// 修改Enter定义
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
OnBnClickedButtonRst();
return TRUE;
}

return CDialogEx::PreTranslateMessage(pMsg);
}
1 change: 1 addition & 0 deletions client/RegisterDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,5 @@ class CRegisterDlg : public CDialogEx
CEdit m_editPassword;
CEdit m_editPwCheck;
virtual void OnOK();
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
7 changes: 7 additions & 0 deletions client/SocketClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ void CSocketClient::MsgProc(CString strMsg)
if (m_Status == STATUS_TRUE) {
pMainDlg->OnCalculateSuccess(m_Text);
}
else
{
pMainDlg->OnCalculateFail();
}
break;
}
case REQUEST_CHARGE: {
Expand All @@ -99,6 +103,9 @@ void CSocketClient::MsgProc(CString strMsg)
}
break;
}
case REQUEST_VALUE: {
pMainDlg->OnUserValueChange(_ttof(m_Text));
}
default:
break;
}
Expand Down
Loading

0 comments on commit 3aa367a

Please sign in to comment.