文章目录
- 1.短连接vs长连接
1.短连接vs长连接
- 服务端本来就可以处理短连接,则不需要修改
原因:P129\ABCBank\BankServer\Server.cpp
P129\ABCBank\BankServer\BankThread.cpp
P129\ABCBank\BankServer\BankSession.cpp - 短连接操作演示
客户端执行查询操作后,客户端就断开连接了 - 将短连接修改成长连接需要注意的地方是:
短连接:每次请求都要连接服务器端,即:one connection per request;
长连接:每个客户端只连接一次服务器端,即:one connection per client; - eg:P 129只是修改了客户端的登录和查询操作,其余的没改,要改自己改下就行
P129\ABCBank\BankClient\UI\LoginForm.cpp
P129\ABCBank\BankClient\UI\BalanceInquiryForm.cpp
P129\ABCBank\BankClient\main.cpp
P129\ABCBank\BankClient\Client.cpp - 以客户端的登录和查询操作为eg,将短连接改成长连接
P128\ABCBank\BankClient\UI\LoginForm.cpp短连接
//客户端BankSession是短连接的原因:BankSession bs;是局部变量,出了该作用域,
//BankSession的析构函数都会被调用,BankSession的智能指针socket_会被释放掉,它所管理的对象Socket也会被释放掉
//所以连接会断开
try
{
BankSession bs;
bs.SetCmd(CMD_LOGIN);
bs.SetAttribute("name", editUser_->GetText());
bs.SetAttribute("pass", editPass_->GetText());
Singleton<TransactionManager>::Instance().DoAction(bs);
P129\ABCBank\BankClient\UI\LoginForm.cpp长连接
try
{
//改成长连接
BankSession* bs = Singleton<Client>::Instance().GetBankSession();//登录操作完成后,bs是存在的,不会释放掉,因为单例的Client端未被释放掉
//因为所有请求和应答数据都公用一个BankSession,所以每次做事情之前最好Clear下
//比如查询明细,可能有应答,应答数据实际保存在response_.clear();,此时又做了一次查询,这次的查询没查到任何内容,但是
//response_.clear()没有clear()掉,会将以前的内容给显示出来,所以每次请求之前都Clear()一下
bs->Clear();
bs->SetCmd(CMD_LOGIN);
bs->SetAttribute("name", editUser_->GetText());
bs->SetAttribute("pass", editPass_->GetText());
- 测试:余额查询完毕后也不会断开连接,即一个客户端与服务器端只保持一个长连接
先启动客户端,再启动服务端的优化
若不优化,则先启动客户端,再启动服务端会出现下面的错误