mac tcp实现客户端与服务端进行图像传输及处理

news/2024/9/24 2:50:40/

客户端发送图像到服务端,服务端对图像进行处理,在将处理后的图像发送到客户端,并且服务端持续监听客户端。

客户端

#include <iostream>
#include <fstream>
#include <vector>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <opencv2/opencv.hpp>#define PORT 8080
#define BUFFER_SIZE 1024
#define IMAGE_PATH "image.jpg"
#define RESULT_IMAGE_PATH "result.jpg"int main() {int sock = 0, valread;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] = {0};// 创建套接字if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {std::cerr << "Socket creation error" << std::endl;return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 将IPv4地址从文本转换为二进制形式if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {std::cerr << "Invalid address/ Address not supported" << std::endl;return -1;}// 连接到服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {std::cerr << "Connection Failed" << std::endl;return -1;}// 读取图像文件std::ifstream file(IMAGE_PATH, std::ios::binary);if (!file) {std::cerr << "Failed to open file: " << IMAGE_PATH << std::endl;return -1;}std::vector<unsigned char> imageData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());// 发送图像数据到服务器send(sock, imageData.data(), imageData.size(), 0);std::cout << "Image sent to server" << std::endl;// 关闭发送方向的连接shutdown(sock, SHUT_WR);// 接收服务器的处理结果std::vector<unsigned char> resultData;while (true) {valread = read(sock, buffer, BUFFER_SIZE);if (valread <= 0) {break;}resultData.insert(resultData.end(), buffer, buffer + valread);}std::ofstream resultFile(RESULT_IMAGE_PATH, std::ios::binary);resultFile.write(reinterpret_cast<const char*>(resultData.data()), resultData.size());resultFile.close();std::cout << "Result image received and saved as: " << RESULT_IMAGE_PATH << std::endl;return 0;
}

服务端

#include <iostream>
#include <vector>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <opencv2/opencv.hpp>#define PORT 8080
#define BUFFER_SIZE 1024void processImage(const std::vector<unsigned char>& imageData, std::vector<unsigned char>& resultData) {cv::Mat image = cv::imdecode(imageData, cv::IMREAD_COLOR);// 在这里进行图像处理,这里只是一个示例,将图像水平翻转cv::flip(image, image, 1);// 将处理后的图像编码为JPEG格式std::vector<int> params;params.push_back(cv::IMWRITE_JPEG_QUALITY);params.push_back(90);cv::imencode(".jpg", image, resultData, params);sleep(3);
}int main() {int server_fd, new_socket, valread;struct sockaddr_in address;int opt = 1;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};// 创建套接字if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 设置套接字选项,允许地址重用if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定套接字到指定端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}while(1){// 接受连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {perror("accept");exit(EXIT_FAILURE);}// 从客户端读取图像数据std::vector<unsigned char> imageData;while (true) {valread = read(new_socket, buffer, BUFFER_SIZE);if (valread <= 0) {break;}imageData.insert(imageData.end(), buffer, buffer + valread);}std::cout << "Received " << imageData.size() << " bytes of image data" << std::endl;// 处理图像数据std::vector<unsigned char> resultData;processImage(imageData, resultData);// 向客户端发送处理后的结果send(new_socket, resultData.data(), resultData.size(), 0);std::cout << "Processed image sent to client" << std::endl;close(new_socket);}return 0;
}

http://www.ppmy.cn/news/1429151.html

相关文章

Jackson知识点记录

文章目录 一.Jackson模块说明 二.ObjectMapper基本功能使用ObjectMapper的一些核心方法&#xff1a;示例代码1. 序列化示例2. 反序列化示例3. JsonNode 处理示例 高级配置 三.各种Node1. ObjectNode2. ArrayNode3. ValueNode4. MissingNode示例 一.Jackson Jackson 库主要分为…

Cjson 库使用

1. JSON简介 JSON全称 JavaScript Object Notation&#xff0c;即 JS对象简谱&#xff0c;是一种轻量级的数据格式。 它采用完全独立于编程语言的文本格式来存储和表示数据&#xff0c;语法简洁、层次结构清晰&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成…

耀斑层-如何在Unity中实现耀斑亮光效果

在Unity中实现耀斑亮光效果可以通过以下步骤来实现&#xff1a; 创建一个空物体作为光源&#xff1a;在场景中创建一个空物体&#xff0c;并将其放置在需要发出耀斑亮光效果的位置上。 添加光源组件&#xff1a;选中空物体&#xff0c;在Inspector面板中点击"Add Compone…

利用Django中的缓存系统提升Web应用性能

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在构建现代Web应用时&#xff0c;性能通常是至关重要的考虑因素之一。为了提高用户体验和应…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c…

视频教程下载:用ChatGPT的 API 开发AI应用指南

通过这门关于 OpenAI API 和 ChatGPT API 的全面课程&#xff0c;在您的应用中释放人工智能的力量。随着人工智能技术的快速发展&#xff0c;比以往任何时候都更重要的是保持领先地位&#xff0c;并为您的项目利用这些尖端工具。在本课程中&#xff0c;您将深入了解人工智能驱动…

云服务器安装docker环境

文章目录 1. Docker安装2. Portainer安装 可以使用termins连接服务器 1. Docker安装 查看系统的内核版本&#xff1a; uname -ryum 更新到最新版本 sudo yum update看到显示 Complete 就代表完成了&#xff0c;整个过程需要 5-10 分钟左右 安装Docker所需的依赖包 sudo yum…

云原生Kubernetes: K8S 1.29版本 部署ingress-nginx

目录 一、实验 1.环境 2. K8S 1.29版本 部署ingress-nginx 二、问题 1.kubectl 如何强制删除 Pod、Namespace 资源 2.创建pod失败 3.pod报错ImagePullBackOff 4.docker如何将镜像上传到官方仓库 5.创建ingress报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表…