Ai
1 Star 0 Fork 0

周不才/cpp_linux study

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
TcpClientMain2.cpp 3.40 KB
一键复制 编辑 原始数据 按行查看 历史
周不才 提交于 2025-03-26 19:15 +08:00 . NetworkComputer_CustomProtocol_V3
//客户端启动入口
#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(); // 关闭读写套接字
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/yan0605/cpp_linux-study.git
git@gitee.com:yan0605/cpp_linux-study.git
yan0605
cpp_linux-study
cpp_linux study
master

搜索帮助