最近在学习使用json格式在Linux中进行tcp通信,以下为学习笔记

我使用的第三方库为 nlohomann/json , 仓库地址为

nlohmann/json: JSON for Modern C++ (github.com)

nlohomann/json 的所有代码都保存在单个头文件 json.hpp 中,所以要使用 nlohomann/json ,需要在实现文件中包含 json.hpp

#include "json.hpp"

json的发送与接收

要发送json格式的数据时需要先将其转换为二进制数据,我使用以下代码实现转换

    json j;
    char sendData[2048];
    ...
    string s = j.dump();//将json转换为string类型
    strcpy(sendData, s.c_str());//将string类型转为char*后进行拷贝

在接收到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转char数组
        json doParse(char*  recvData);//char数组转json
        json vector2json(vector<string> & s);//vector转json
        void json2vector(json & j, vector<string> & v);//json转vector
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()
  //1. 创建监听服务器的套接字
  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
  //2. 绑定服务器的网络地址
  if(::bind(listenfd, (struct sockaddr*)&serveraddr, length) < 0)
    perror("bind");
    //文件描述符是比较稀缺的,所以不用的时候要回收
    close(listenfd);
    return;
  //3. 让服务器开始监听
  if(::listen(listenfd, 10) < 0)
    perror("listen");
    close(listenfd);
    return;
  printf("server is listening...\n");
  //4. 获取对端的文件描述符,并与对端进行通信
  int peerfd = ::accept(listenfd, nullptr, nullptr);
  //5. 需求:希望服务器可以与客户端通过终端进行聊天
  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)
    // string line;
    // cout << ">> pls input some message:";
    // getline(cin, line);
    // line.append("\n");
    char sendData[2048] = {0};
    vector<string> vec={"hello", "world"};
    ProtocolParser parser;
    json j = parser.vector2json(vec);
    parser.Json2char(j, sendData);
    // 1. 客户端先发数据
    send(clientfd, sendData, strlen(sendData), 0);
    /* close(clientfd); */
    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 &lt;stdio.h&gt; #include&lt;iostream&gt; #i...
版权声明:转载时请以超链接形式标明文章原始出处和作者信息 本文链接:http://adebugger.cn/2009/11/cpp-json-data-communication/ Json大家都耳熟能详了吧?现在Json广泛用于各类通信,特别是基于Http协议的通信,一般的服务端动态脚本语言都有库支持Json的编码与解码。但很少有听过JsonC++使用来作为通信的格式,不过去了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解析