要发送json格式的数据时需要先将其转换为二进制数据,我使用以下代码实现转换
json j;
char sendData[2048];
...
string s = j.dump();
strcpy(sendData, s.c_str());
在接收到json的二进制数据后,再将其转换为json格式
recv(peerfd, recvdata, 2048, 0);
json j = json::doParse(recvData);
我封装了一个用于json与内置数据类型与STL容器转换的类
#include "json.hpp"
#include <vector>
#include <string>
class ProtocolParser
public:
void Json2char(json & j, char* sendData);
json doParse(char* recvData);
json vector2json(vector<string> & s);
void json2vector(json & j, vector<string> & v);
using std::string;
void ProtocolParser::Json2char(json & j, char* sendData)
string s = j.dump();
strcpy(sendData, s.c_str());
json ProtocolParser::doParse(char * recvData)
return json::parse(recvData);
json ProtocolParser::vector2json(vector<string> & s)
return json(s);
void ProtocolParser::json2vector(json & j, vector<string> & v)
v.clear();
v = j.get<vector<string>>();
以下为在客户端与服务端中使用ProtocolParse类的示例
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "json.hpp"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "ProtocolParser.h"
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using nlohmann::json;
void test()
int listenfd = ::socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0)
perror("socket");
return;
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(8888);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
socklen_t length = sizeof(serveraddr);
#if 1
int on = 1;
if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int)) < 0)
perror("setsockopt");
close(listenfd);
return;
if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(int)) < 0)
perror("setsockopt");
close(listenfd);
return;
#endif
if(::bind(listenfd, (struct sockaddr*)&serveraddr, length) < 0)
perror("bind");
close(listenfd);
return;
if(::listen(listenfd, 10) < 0)
perror("listen");
close(listenfd);
return;
printf("server is listening...\n");
int peerfd = ::accept(listenfd, nullptr, nullptr);
while(1)
char recvdata[2048];
int ret = recv(peerfd, recvdata, 2048, 0);
printf("recv msg from client: %s\n", recvdata);
recvdata[ret] = '\0';
ProtocolParser parse;
json j = parse.doParse(recvdata);
cout << j << endl;
cout << ">> pls input some message:";
string line;
getline(cin, line);
send(peerfd, line.c_str(), line.size(), 0);
close(peerfd);
close(listenfd);
int main(void)
test();
return 0;
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <vector>
#include "json.hpp"
#include "ProtocolParser.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using nlohmann::json;
using std::vector;
void test()
int clientfd = ::socket(AF_INET, SOCK_STREAM, 0);
if (clientfd < 0)
perror("socket");
return;
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
socklen_t length = sizeof(serverAddr);
if (::connect(clientfd, (struct sockaddr* )&serverAddr, length) < 0)
perror("connect");
close(clientfd);
return;
printf("conn has connected!...\n");
while (1)
char sendData[2048] = {0};
vector<string> vec={"hello", "world"};
ProtocolParser parser;
json j = parser.vector2json(vec);
parser.Json2char(j, sendData);
send(clientfd, sendData, strlen(sendData), 0);
char buff[128] = {0};
recv(clientfd, buff, sizeof(buff), 0);
printf("recv msg from server: %s\n", buff);
close(clientfd);
int main(void)
test();
return 0;
服务端进程
客户端进程
最近在学习使用json格式在Linux中进行tcp通信,以下为学习笔记我使用的第三方库为, 仓库地址为nlohmann/json: JSON for Modern C++ (github.com)的所有代码都保存在单个头文件中,所以要使用,需要在实现文件中包含json的发送与接收要发送json格式的数据时需要先将其转换为二进制数据,我使用以下代码实现转换在接收到json的二进制数据后,再将其转换为json格式代码实例我封装了一个用于json与内置数据类型与STL容器转换的类以下为在客户端与服务端
服务端发送给客户端,服务端有一串字符串,按照分隔符将其分割,并存入json,发给客户端,然后输出。
Json.hpp 下载地址https://github.com/nlohmann/json/tree/develop/include/nlohmann
一.服务端
main.cpp
#include <stdio.h>
#include<iostream>
#i...
版权声明:转载时请以超链接形式标明文章原始出处和作者信息
本文链接:http://adebugger.cn/2009/11/cpp-json-data-communication/
Json大家都耳熟能详了吧?现在Json广泛用于各类通信,特别是基于Http协议的通信,一般的服务端动态脚本语言都有库支持Json的编码与解码。但很少有听过Json被C++使用来作为通信的格式,不过去了http://www.json.org/
1.数据发送端---socket server端
Qt发送json数据,Qt提供了 QJsonObject 类和QJsonDocument 类,使用提供的两个类,可以实现将json数据转化成QString数据,再进行打包,增加协议头和长度,实现 head+len+data这种协议格式。
数据发送端是基于Qt开发的,下面是核心部分代码
void TcpServer::sendUpFrame() {
m_jsonObject->insert("speed", (int)m_speed);
工作需要,下班回来自己造轮子,记录以后查阅。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要Linux下使用Jsoncpp解析json的方法做一下记录。
2. 关于jsoncpp库的使用简介..
1、因为跨语言太灵活需要字段一一对应沟通好
2、因为可读性很好冗余信息太多
总体来说还是可以作为客户端和服务器处理消息的,并不是所有客户端都能支持protobuf但基本都能支持json
处理json的库很多,在boost中可以用property_tree进行处理
以下是用json...
文章目录前言1. C 库Json解析2. C++ libjsoncpp.a解析2-1. 下载和编译2-2. 使用Json::FastWriter封JSON包(不推荐)2-3.使用Json::Reader解析JSON包(不推荐)2-4.使用Json::StreamWriterBuilder封JSON包2.5 使用Json::CharReaderBuilder 和 Json::CharReader 解析 json 字符串
1. C 库Json解析
2. C++ libjsoncpp.a解析