代码拉取完成,页面将自动刷新
//客户端启动入口
#include <iostream>
#include <string>
#include <regex>//提供正则表达式
#include <memory>//提供智能指针
#include "Socket.hpp"//提供Socket编程接口
#include "Log.hpp"//提供日志
#include "CustomProtocol.hpp"//提供自定义协议(自定义的数据格式和序列化反序列化的方法)
using namespace socket_ns;
//客户端启动命令:./tcpclient 服务端ip地址 服务端端口号
int main(int argc,char* argv[])
{
if (argc != 3)
{
std::cerr << "Usage: " << argv[0] << " serverip serverport" << std::endl;
exit(0);
}
std::string serverip = argv[1];//保存服务端ip地址
uint16_t serverport = std::stoi(argv[2]);//保存服务端端口号
std::shared_ptr<Socket> readwritesock=std::make_shared<TcpSocket>();
bool ret=readwritesock->StartConnecting(serverip,serverport);
if(ret==false)
{
std::cerr << "connect error" << std::endl;
exit(1);
}
while (true)
{
int x;
char op;
int y;
std::cout << "Enter# ";
// std::string expression;
// std::getline(std::cin, expression); // 输入表达式
// x = std::stoi(expression.substr(0, 1));
// op = expression[1];
// y = std::stoi(expression.substr(2, 1));
//改用正则表达式
std::string expression;
std::getline(std::cin, expression); // 输入表达式
std::smatch match;
if (std::regex_match(expression, match, std::regex(R"((\d+)([+\-*/])(\d+))")))
{
x = std::stoi(match[1]);
op = match[2].str()[0];
y = std::stoi(match[3]);
}
else
{
LOG(ERROR, "invalid input format\n");
continue;
}
std::shared_ptr<Request> req = Factory::BuildRequest();
req->SetValue(x, y, op); // 初始化Request对象数据
LOG(DEBUG, "%d,%d,%c\n", req->GetX(), req->GetY(), req->Getoperator());
// 1.序列化,并将序列化的结果存储到jsonstr中
std::string jsonstr;
req->Serialize(&jsonstr);
// 2.添加报头,并将添加报头后的数据存储到packagejsonstr中
std::string packagejsonstr;
packagejsonstr = Encode(jsonstr);
// 3.发送数据
readwritesock->Send(packagejsonstr);
// 4.读取数据,并将读取到的数据存储到packagejsonstr2中
std::string packagejsonstr2;
while (true)
{
ssize_t n = readwritesock->Receive(&packagejsonstr2);
if (n <= 0) // 读取失败
{
break;
}
// 读取成功,开始去除报头(此处读取到的数据可能不是完整的数据)
std::string jsonstr2 = Decode(packagejsonstr2);
if (jsonstr2.empty()) // 去除报头结果为空串,说明读取到的数据不是完整的数据,重新读取
{
continue;
}
// 去除报头成功,反序列化
std::shared_ptr<Response> res = Factory::BuildResponse();
res->Deserialize(jsonstr2); // 此处会直接将反序列化后的存储到res对象中
LOG(DEBUG, "Deserialize success\n");
// 输出结果
res->Result();
break;//重新计算下一个表达式
}
}
readwritesock->CloseSocket(); // 关闭读写套接字
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。