本文主要是介绍(P129)abcbank长连接版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 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());
- 测试:余额查询完毕后也不会断开连接,即一个客户端与服务器端只保持一个长连接
先启动客户端,再启动服务端的优化
若不优化,则先启动客户端,再启动服务端会出现下面的错误
这篇关于(P129)abcbank长连接版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!