C++实现json形式的Socket传输图片

2020-03-20 20:02:12于丽

本文实例为大家分享了C++实现json形式的Socket传输图片的具体代码,供大家参考,具体内容如下

大致流程:客户端读取图片,经过Base64编码,转成字符串的形式,保存到json中,通过socket传到服务端,然后Base64解码,再转换成图片

一.服务端

1.main.cpp

#include <iostream>
#include <stdio.h>
#include "Base64_1.h"
#include <winsock2.h> 
#include "json1.hpp"
 
#pragma comment(lib,"ws2_32.lib") 
using json = nlohmann::json;
 
char revData[3888888];
 
bool WritePhotoFile(std::basic_string<TCHAR> strFileName, std::string &strData)
{
 HANDLE hFile;
 hFile = CreateFile(strFileName.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 
 if (hFile == INVALID_HANDLE_VALUE)
 {
 return false;
 }
 
 CBase64 base64;
 
 int datalen(0);
 DWORD dwritelen(0);
 std::string strdcode = base64.Decode(strData.data(), strData.size(), datalen);
 if (!WriteFile(hFile, strdcode.data(), datalen, &dwritelen, NULL))
 {
 CloseHandle(hFile);
 return false;
 }
 CloseHandle(hFile);
 return true;
}
 
 
 
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 (sClient == INVALID_SOCKET)
 {
 printf("accept error !");
 continue;
 }
 printf("接受到一个连接:%s rn", inet_ntoa(remoteAddr.sin_addr));
 
 //接收数据 
 int ret = recv(sClient, revData, 3888888, 0);
 if (ret > 0)
 {
 revData[ret] = 0x00;
 json o = json::parse(revData);
 for (json::iterator it = o.begin(); it != o.end(); ++it) {
 //std::cout << it.key() << " : " << it.value() << "n";
 if (it.key() == "imgA"|| it.key() == "imgB")
 {
 std::string num = std::to_string(i++);
 std::string strFileName = "D:"+ num +".jpg";
 std::string val = it.value();
 WritePhotoFile(strFileName, val);
 }
 
 }
 //std::cout<< json::parse(revData)<< std::endl;
 //printf(revData);
 }
 
 //发送数据 
 //const char * sendData = "你好,TCP客户端!n";
 //send(sClient, sendData, strlen(sendData), 0);
 closesocket(sClient);
 }
 
 
 closesocket(slisten);
 WSACleanup();
 
 return 0;
}