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

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

客户端

#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.mzph.cn/bicheng/214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Shell语言】linux中awk命令

linux中awk命令 看这里放声嘶吼谁也不舍得沉默 宽阔也抓不住我下一秒钟的echo ——《暂时失控》苏打绿 awk命令简介 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 B…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗&#xff1f; 岁数大了&#xff0c;希望如何学习新知识呢&#xff1f;又觉得自己哪些能力亟需补强呢&#xff1f; 看论文自然得用Kimi&#xff0c;主要是肝不动了&#xff0c;眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

【Java】ArrayList removeIf() 方法

removeIf() 方法用于删除所有满足特定条件的数组元素。 removeIf()方法的语法为&#xff1a; arraylist.removeIf(Predicate<E> filter) 注&#xff1a;arraylist 是 ArrayList 类的一个对象。 参数说明&#xff1a;filter - 过滤器&#xff0c;判断元素是否要删除 返回…

Python中的Super方法实现问题及解决方案

1、问题背景 在Python中&#xff0c;super方法用于在子类中调用父类的方法。Guido van Rossum曾给出了一个纯Python实现的super方法&#xff0c;以便更好地理解其工作原理。然而&#xff0c;在这个实现中&#xff0c;存在一个问题&#xff1a;当传入的对象不是要调用的父类的实…

C++入门 (2)

文章目录 C入门C输入输出缺省参数全缺省半缺省函数声明与定义分离 函数重载C支持函数重载的原理--名字修饰 C入门 C输入输出 C输入输出包含在# include《iostream》中 cout 类似在控制台中输出&#xff0c;使用cout需要使用流插入符&#xff08;<<&#xff09; 这个符号…

代码随想录训练营-15day:二叉树4

一、平衡二叉树 平衡二叉树的定义&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 使用递归方式&#xff1a;首先需要知道高度是什么意思&#xff0c;怎么获取高度。如果高度差大于1了&#xff0c;那么回复高度就没有意义了。 /*** Definition for…

Hotcoin4月16日上新热门资产:头部RWA技术提供方Centrifuge(CFG)

Hotcoin持续为全球600万用户发掘优质潜力资产&#xff0c;热门币种交易上热币。一文快速了解今日上新资产:Centrifuge(CFG) 推荐指数 8.2 交易对 CFG/USDT 交易时间 4月16日 19:00 资产赛道 RWA 项目简介 Centrifuge是一个去中心化资产融资协议&#xff0c;专注于释放现实世界资…

leetcode刷题(python)——(三)

01.02.02 练习题目&#xff08;第 03 天&#xff09; 1. 0066. 加一 1.1 题目大意 描述&#xff1a;给定一个非负整数数组&#xff0c;数组每一位对应整数的一位数字。 要求&#xff1a;计算整数加 1 1 1 后的结果。 说明&#xff1a; 1 ≤ d i g i t s . l e n g t h ≤…

网关模式和网桥模式的区别

网关&#xff0c;大家都知道&#xff0c;从一个房间走到另一个房间&#xff0c;必然要经过一扇门。同样&#xff0c;从一个网络向另一个网络发送信息&#xff0c;也必须经过一道“关口”&#xff0c;这道关口就是网关。顾名思义&#xff0c;网关(Gateway)就是一个网络连接到另一…

Object.hasOwn is not a function

背景 开发一个H5页面,使用Object.hasOwn来测试属性是否存在,在error监控中,发现某些用户访问会出现如下报错: 问题分析 因为不是所有的用户都报错,继而先去mdn上查看这个api的浏览器兼容性: Object.hasOwn() - JavaScript | MDN 从【Can I Use】上也查看了此web技术的…

STM32串口通信

一、串口发送 1.初始化引脚 void Serial_Init(uint32_t BaudRate) {RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA ,ENABLE );RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 ,ENABLE );GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP…

[疑难杂症2024-003]如何判断一张没有头信息的dcm图像,是否是压缩图像?

本文由Markdown语法编辑器编辑完成&#xff0e; 1. 前言: DCM格式&#xff0c;是医学图像领域里面的通用格式&#xff0e;DCM图像一般分为两大部分&#xff0c;一部分是TAG信息&#xff0c;一部分是像素. 而TAG信息&#xff0c;一般又会分为两部分&#xff0c;如下图所示, 是…

C++_智能指针

文章目录 前言一、智能指针原理二、库支持的智能指针类型1.std::auto_ptr2.std::unique_ptr3.std::shared_ptr4.std::weak_ptr 三、删除器总结 前言 智能指针是一种采用RAII思想来保护申请内存不被泄露的方式来管理我们申请的内存&#xff0c;对于RAII&#xff0c;我们之前也已…

LeetCode-热题100:102. 二叉树的层序遍历

题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a; [[3],[9,20],[15,7]] 示例 2&am…

【GEE实践应用】使用MODIS NDVI数据集绘制研究区域每日NDVI序列曲线

// 设置研究区域 var geometry table;// 选择MODIS NDVI 数据集 var modisNDVI ee.ImageCollection(MODIS/006/MOD13A2).filterBounds(geometry).filterDate(2000-01-01, 2023-12-31);// 计算每天的平均 NDVI var dailyMeanNDVI modisNDVI.map(function(image) {var date e…

AndroidStudio AGP 7+, 编译aar并输出到本地仓库

1 编写构建gradle脚本代码 1.1 配置publication和repository 在指定moudle目录下新建名为"maven-publish.gradle"文件&#xff0c;其声明的publication和repository如下所示&#xff1a; apply plugin: maven-publish// This creates a task called publishReleas…

# 从浅入深 学习 SpringCloud 微服务架构(二)模拟微服务环境

从浅入深 学习 SpringCloud 微服务架构&#xff08;二&#xff09;模拟微服务环境&#xff08;1&#xff09; 段子手168 1、打开 idea 创建父工程 创建 artifactId 名为 spring_cloud_demo 的 maven 工程。 --> idea --> File --> New --> Project --> Ma…

记录一个sentinel修改密码方法

docker run --name sentinel --restartalways -p 8858:8858 -d bladex/sentinel-dashboard 使用docker装了sentinel&#xff0c;公司不允许使用默认密码。 使用docker exec -it sentinel /bin/bash进入容器内 在app.jar所在目录下创建application.properties的配置文件 # I…

MongoDB学习【三】MongoDB基本操作命令

1. 启动MongoDB服务&#xff1a; 在Windows环境下&#xff0c;通常你可以通过命令提示符(cmd)来启动MongoDB服务。首先确保已经正确设置了--dbpath参数指向数据库文件存储的位置&#xff0c;然后执行mongod服务程序&#xff1a; mongod --dbpath D:\mongo在Linux系统中&#…

java高校办公室行政事务管理系统设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于mvc的高校办公室行政…