C++端(客户端client)
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
#define BuffSize 1024
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return -1;
}
Mat imgSrc = imread("F:\\PycharmProjects\\Facial\\testface\\5.jpg", IMREAD_UNCHANGED);
if (imgSrc.empty())
{
return -1;
}
Mat img;
img.create(imgSrc.size(), imgSrc.type());
img = imgSrc.clone();
int totalNum = img.rows*img.cols*img.elemSize();
while (true)
{
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//本机
//addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.1.107");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8888);
int sec = connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (SOCKET_ERROR == sec)
{
continue;
}
char* pos = (char*)img.data;
int colByte = img.cols*img.channels() * sizeof(uchar);
for (int i = 0; i < img.rows; i++)
{
char* data = (char*)img.ptr<uchar>(i); //第i行首地址
int sedNum = 0;
char buf[BuffSize] = { 0 };
//按行拆分,发送数据
while (sedNum < colByte)
{
int sed = (BuffSize < colByte - sedNum) ? BuffSize : (colByte - sedNum);
memcpy(buf, &data[sedNum], sed);
int SendSize = send(sockClient, buf, sed, 0);
if (SOCKET_ERROR == SendSize)
return -1;
/*else
cout << SendSize << endl;*/
sedNum += SendSize;
}
}
char recvBuf[50];
int ns = recv(sockClient, recvBuf, 50, 0);
recvBuf[ns] = '\0';
printf("severRecv %s\n", recvBuf);
Sleep(5);
char t[2];
std::cin >> t;
}
WSACleanup();
getchar();
return 0;
}
python端(service)
import numpy as np
import socket
import time
from PIL import Image
import cv2
# 图像尺寸
wid = 512
hig = 384
channels = 3
def recvall(sock, count):
buf = b''
while count:
newbuf = sock.recv(count)
if not newbuf: return None
buf += newbuf
count -= len(newbuf)
return buf
if __name__ == '__main__':
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 8888))
server.listen(0)
totleNum = wid * hig * channels # 总共多少数据
while True:
connection, address = server.accept()
print(connection, address)
stringData = recvall(connection, int(totleNum))
# data = np.fromstring(stringData, dtype='uint8')
data = np.frombuffer(stringData, dtype='uint8')
print(len(data))
# 解析数据
# 方法一
Array = data.reshape(hig, wid, channels)
im = Image.fromarray(Array)
im.save("out.jpg")
im.show("test")
# 方法二
# decimg = np.zeros((hig, wid, channels), np.uint8)
# for i in range(0, hig):
# for j in range(0, wid):
# for k in range(0, channels):
# decimg[i][j][k] = data[(i * wid + j) * channels + k]
#
# # cv2.imwrite('.\SERVER.jpg', decimg)
# cv2.namedWindow("test", 0)
# cv2.imshow("test", decimg)
# cv2.waitKey(0)
connection.send(bytes("clientRecv: ok", encoding="ascii"))
time.sleep(10)
connection.close()
input("enter end")