当前位置:   article > 正文

C语言socket发送json,C++实现Socket传输json封装的Mat

c++ tcp发送json

另一篇比较好的博客:https://blog.csdn.net/weixin_42731241/article/details/81775571

一般进行图片传输时,先用openCV把图片转换为Mat,然后封装到json当中,然后再从json中解析出来。这次是客户端向服务端传输。

Ps:客户端第一次发送一张图片,第二次发送两张图片,后面依次循环,转成Mat封装到json中,服务端接收并解析,如果是一张图片生成名称和相似度,如果是两张只生成相似度,封装到json,并返回至客户端(用于人脸识别的,读者可以根据自己的需要改动)

客户端:图片转换为Mat用imread即可,然后Mat通过imencode函数转为uchar*,再转换为string类型,然后通过c_str()函数转换为const char*,最后Base64编码存到json里面(我找的Base64.h编码只能用这个数据类型,所以这个转换数据类型卡了我很长时间,关键还是对数据类型不熟悉)

服务端:json里面的数据进行Base64解码成string,然后转换为uchar*,再通过imdecode转换成Mat,最后imshow显示或者imwrite保存(相当于客户端的逆过程)

openCV的配置过程在之前的博客中

json.hpp 下载地址https://github.com/nlohmann/json/tree/develop/include/nlohmann

一.服务端

#include #include #include "Base64.h"

#include #include "json1.hpp"

#include #pragma comment(lib,"ws2_32.lib")

using namespace cv;

using json = nlohmann::json;

char revData[3888888];

int main(int argc, char* argv[])

{

//初始化WSA

WORD sockVersion = MAKEWORD(2, 2);

WSADATA wsaData;

if (WSAStartup(sockVersion, &wsaData) != 0)

{

return 0;

}

//创建套接字

SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (slisten == INVALID_SOCKET)

{

printf("socket error !");

return 0;

}

//绑定IP和端口

sockaddr_in sin;

sin.sin_family = AF_INET;

sin.sin_port = htons(8888);

sin.sin_addr.S_un.S_addr = INADDR_ANY;

if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

{

printf("bind error !");

}

//开始监听

if (listen(slisten, 5) == SOCKET_ERROR)

{

printf("listen error !");

return 0;

}

//循环接收数据

SOCKET sClient;

sockaddr_in remoteAddr;

int nAddrlen = sizeof(remoteAddr);

//revData = (char*)malloc(sizeof(char) * 1000000);

int i = 1;

while (true)

{

printf("等待连接...\n");

sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);

if

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号