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

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

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

一.服务端

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

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;  }

2.Base64.cpp

  #include"Base64_1.h"     CBase64::CBase64()  {     }     CBase64::~CBase64()  {     }     std::string CBase64::Encode(const char* Data, int DataByte)  {   //编码表    const char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";   //返回值    std::string strEncode;   unsigned char Tmp[4] = { 0 };   int LineLength = 0;   for (int i = 0; i<(int)(DataByte / 3); i++)   {   Tmp[1] = *Data++;   Tmp[2] = *Data++;   Tmp[3] = *Data++;   strEncode += EncodeTable[Tmp[1] >> 2];   strEncode += EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];   strEncode += EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];   strEncode += EncodeTable[Tmp[3] & 0x3F];   if (LineLength += 4, LineLength == 76) { strEncode += "rn"; LineLength = 0; }   }   //对剩余数据进行编码    int Mod = DataByte % 3;   if (Mod == 1)   {   Tmp[1] = *Data++;   strEncode += EncodeTable[(Tmp[1] & 0xFC) >> 2];   strEncode += EncodeTable[((Tmp[1] & 0x03) << 4)];   strEncode += "==";   }   else if (Mod == 2)   {   Tmp[1] = *Data++;   Tmp[2] = *Data++;   strEncode += EncodeTable[(Tmp[1] & 0xFC) >> 2];   strEncode += EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];   strEncode += EncodeTable[((Tmp[2] & 0x0F) << 2)];   strEncode += "=";   }      return strEncode;  }     std::string CBase64::Decode(const char* Data, int DataByte, int& OutByte)  {   //解码表    const char DecodeTable[] =   {   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   62, // '+'    0, 0, 0,   63, // '/'    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'    0, 0, 0, 0, 0, 0, 0,   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'    0, 0, 0, 0, 0, 0,   26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,   39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'    };   //返回值    std::string strDecode;   int nValue;   int i = 0;   while (i < DataByte)   {   if (*Data != 'r' && *Data != 'n')   {   nValue = DecodeTable[*Data++] << 18;   nValue += DecodeTable[*Data++] << 12;   strDecode += (nValue & 0x00FF0000) >> 16;   OutByte++;   if (*Data != '=')   {   nValue += DecodeTable[*Data++] << 6;   strDecode += (nValue & 0x0000FF00) >> 8;   OutByte++;   if (*Data != '=')   {   nValue += DecodeTable[*Data++];   strDecode += nValue & 0x000000FF;   OutByte++;   }   }   i += 4;   }   else// 回车换行,跳过    {   Data++;   i++;   }   }   return strDecode;  }

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/484458.html

(0)
上一篇 2020年11月10日
下一篇 2020年11月10日

精彩推荐