c客户端http post chunked协议上传到服务器demo源码

article/2025/10/18 10:08:56

下面例子中 :c 客户端采用 chunked协议上传到服务器,java 服务器返回的不是chunked 协议

chunked 编码协议格式参考 https://blog.csdn.net/wy5761/article/details/17568851

c 客户端 chunked 完整内容是 Hello, world,how are you 。分了2块上传 Hello, world 和 ,how are you

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netdb.h>#define HOST "xx.xxx.xxx.xxx"
#define PORT 80
#define API "/test"struct resp_header{int status_code;//200char content_type[128];//Content-Type: long content_length;//Content-Length: 
};static void get_resp_header(const char *response,struct resp_header *resp){//获取响应头的信息char *pos = strstr(response, "HTTP/");if (pos)sscanf(pos, "%*s %d", &resp->status_code);//返回状态码pos = strstr(response, "Content-Type:");//返回内容类型if (pos)sscanf(pos, "%*s %s", resp->content_type);pos = strstr(response, "Content-length:");//内容的长度(字节)if (pos){sscanf(pos, "%*s %ld", &resp->content_length);}else{pos = strstr(response, "Content-Length:");//内容的长度(字节)if (pos){sscanf(pos, "%*s %ld", &resp->content_length);}}
}static void getResponse( int socket_fd)//, char **text)
{/* receive the response */char * response=NULL;response=(char*)malloc(2048);if(response==NULL){return;}memset(response, 0, 2048);int length = 0,mem_size=2048;struct resp_header resp;int ret=0;while(1){ret = recv(socket_fd, response+length, 1,0);if(ret<=0)break;//找到响应头的头部信息, 两个"\r\n"为分割点int flag = 0;int i;for (i = strlen(response) - 1; response[i] == '\n' || response[i] == '\r'; i--, flag++);if (flag == 4)	  break;length += ret;if(length>=mem_size-1){break;}}printf("response head :%s \n",response);get_resp_header(response,&resp);printf("resp.Content_length = %ld status_code = %d\n",resp.content_length,resp.status_code);if(resp.status_code!=200||resp.content_length==0){free(response);return;}free(response);char *body = (char *)malloc(resp.content_length+1);memset(body,0,resp.content_length+1);if(body==NULL){return;}ret=0;length=0;while(1){ret = recv(socket_fd, body+length, resp.content_length-length,0);if(ret<=0){break;}length+=ret;if(length==resp.content_length)break;}printf("response body :%s\n",body);//*text = body;
}static int get_connect_socket_fd(char *host,int port)
{int sockfd;struct hostent *server;struct sockaddr_in serv_addr;/* create the socket */sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){printf("ERROR opening socket\n");return -1;}/* lookup the ip address */server = gethostbyname(host);if (server == NULL) {printf("ERROR, no such host \n");return -1;}/* fill in the structure */memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(port);memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);/* connect the socket */if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0){printf("ERROR connecting \n");return -1;}return sockfd;   
}int main(int argc, char **argv)
{int sockfd;sockfd = get_connect_socket_fd(HOST,PORT);if(sockfd == -1){printf("get_connect_socket_fd error!!!");return 0;}char str[4096];memset(str, 0, 4096);sprintf(str,"POST %s HTTP/1.1\r\n",API);strcat(str, "Host: ");strcat(str, HOST);strcat(str, "\r\n");//strcat(str, "Content-Type: application/x-www-form-urlencoded\n");strcat(str, "Content-Type: application/octet-stream;charset=utf-8\r\n");strcat(str, "Transfer-Encoding: chunked\r\n");strcat(str, "Connection: keep-alive\r\n");strcat(str, "Content-Transfer-Encoding: binary\r\n");strcat(str, "Accept-Ranges: bytes\r\n");strcat(str, "\r\n");//headwrite(sockfd,str,strlen(str));//chunked 1char chunkdata1[128] = "Hello, world";char chunklength1[128] = {0};sprintf(chunklength1,"%x",strlen(chunkdata1));//chunklength1write(sockfd,chunklength1,strlen(chunklength1));write(sockfd,"\r\n",strlen("\r\n"));//chunkdata1write(sockfd,chunkdata1,strlen(chunkdata1));write(sockfd,"\r\n",strlen("\r\n"));//chunked 2char chunkdata2[128] = ",how are you";char chunklength2[128] = {0};sprintf(chunklength2,"%x",strlen(chunkdata2));//chunklength2write(sockfd,chunklength2,strlen(chunklength2));write(sockfd,"\r\n",strlen("\r\n"));//chunkdata2write(sockfd,chunkdata2,strlen(chunkdata2));write(sockfd,"\r\n",strlen("\r\n"));//chunked end 0write(sockfd,"0\r\n\r\n",strlen("0\r\n\r\n"));//response from servergetResponse(sockfd);close(sockfd);return 0;
}

运行效果如图:
在这里插入图片描述

java 服务器 接收chunked 协议上传的内容 代码 参考我之前的文章 提供的http服务器代码
https://blog.csdn.net/a704397849/article/details/88079945

HttpCmd 里面有个方法 readTrunkTest() 可以读取 chunked 内容

服务器端 读取c 客户端chunked上传的内容 的主要代码如下(框架代码在上述连接中) :

import frame.http.HttpCmd;public class HttpCmdTest extends HttpCmd {static {HttpCmd.register("/chunked/test",HttpCmdTest.class);}@Overridepublic void execute() {int size = 0;byte[] bytes = readTrunkTest();String s = "";if(bytes != null){size = bytes.length;try {s = new String(bytes, "utf-8");}catch (Exception e){}}response("{request body size = " + size + " , str = " + s +  "}");}
}

最后,如果c客户端想要实现解析来自服务器的chunked协议内容 ,下面地址 返回的就是chunked协议内容,可以用这个来调试开发
http://www.httpwatch.com/httpgallery/chunked/chunkedimage.aspx


http://chatgpt.dhexx.cn/article/hgqGdWjw.shtml

相关文章

HTTP CHUNKED

服务端给浏览器发送报文时&#xff0c;必须告诉浏览器报文的大小&#xff0c;这样浏览器可以根据报文大小来判断报文的完整性以及在长连接中确定报文的截尾。但是很多服务器的报文是动态创建的&#xff0c;在发送之前是无法确定其大小的。服务器只有等待内容全部创建后&#xf…

chunked java_HTTP协议的chunked编码

一般情况HTTP的Header包含Content-Length域来指明报文体的长度。如&#xff1a; 有时候服务生成HTTP回应是无法确定消息大小的&#xff0c;比如大文件的下载&#xff0c;或者后台需要复杂的逻辑才能全部处理页面的请求&#xff0c;这时用需要实时生成消息长度&#xff0c;服务器…

HTML中chunked解码和gzip解压

chunked编码 chunked编码的的好处 当访问的时动态页面时&#xff0c;服务器则无法预知内容的大小&#xff0c;因此需要一遍产生数据&#xff0c;一边发送数据&#xff0c;将数据分块发送(服务器通过响应头’Transfer-Encoding: chunked’告诉浏览器它将使用chunked编码传输)。…

Android:rxjava简单实现原理(map/flatmap操作符)

rxjava 装饰者模式1、背景2、定义3、特征4、装饰者模式demo rxjava装饰者模式1、rxjava中转换操作符map的简单实现2、rxjava中转换操作符flatmap的简单实现 装饰者模式 1、背景 假设奶茶店有两种茶&#xff0c;果茶&#xff08;fruit tea&#xff09;和奶茶(milky tea)&#…

java dataset flatmap_Spark中map和flatMap的區別詳解

本文介紹了Spark中map(func)和flatMap(func)這兩個函數的區別及具體使用。 函數原型 1.map(func) 將原數據的每個元素傳給函數func進行格式化&#xff0c;返回一個新的分佈式數據集。(原文&#xff1a;Return a new distributed dataset formed by passing each element of the…

Spark中flatMap的操作

Test 1&#xff1a; package test.wyh.wordcountimport org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext}object TestFlatMap {def main(args: Array[String]): Unit {//建立Spark连接val sparkConf new SparkConf().setMaster("local&quo…

flatMap底层实现

上篇&#xff1a;Transformation的map使用 第一种方式重写flatMap方法实现 实现需求&#xff1a;根据字符串在nc -lk 8888的窗口命令下输入的数据&#xff0c;在控制台打印输出发现&#xff1a;在同一行数据输入的单词字符串自动换行&#xff0c;按每个单词独立换行并且若输入…

java7 flatmap_flink学习之七-map、fliter、flatmap

看完了Flink的datasource、sink&#xff0c;也就把一头一尾给看完了&#xff0c;从数据流入到数据流出&#xff0c;缺少了中间的处理环节。 而flink的大头恰恰是只在这个中间环节&#xff0c;如下图&#xff1a; source-transform-sink-update.png 中间的处理环节比较复杂&…

Stream之flatMap

一、flatMap简介 flatMap:将小Stream转换为大Stream 二、示例转换要求 目标&#xff1a;将如下对象中的分类category提取出来&#xff0c;去重。其中如"哲学,爱情",需要解析为两个分类&#xff0c;["哲学","爱情"] [{"age":33,"…

flatmap使用

使用场景 适用于嵌套list数据结构&#xff0c;想把内部的list数据合并成一个list.。 举例如下&#xff1a; public class Test {public static void main(String[] args) {List<List<String>> list new ArrayList<>();List<String> list1 new Arr…

Java8中map与flatMap用法

目录 1 概述 2 map与flatMap 3 常用写法 1 概述 Java8中一些新特性在平时工作中经常会用到&#xff0c;但有时候总感觉不是很熟练&#xff0c;今天特意将这个Java8中的映射记录一下。 2 map与flatMap map---对集合中的元素逐个进行函数操作映射成另外一个 flatMap---接收一…

如何使用flatMap

1. 什么情况下用到flatMap 当使用map&#xff08;&#xff09;操作时&#xff0c;不是返回一个值&#xff0c;而是返回一个集合或者一个数组的时候&#xff0c;这时候就可以使用flatMap解决这个问题。举个例子&#xff0c;你有一个列表 [21,23,42]&#xff0c;然后你调用getPr…

【JavaScript中数组的flatMap方法的详细介绍】

在我们平时对数组进行操作的时候&#xff0c;通常map、forEach和filter方法比较常用。而flatMap方法用得相对少一些。当你掌握了flatMap方法的使用之后&#xff0c;我相信你一定会喜欢上它的&#xff01; 下面我们会通过以下三个问题展开对flatMap方法的讲解&#xff1a; 1. f…

Java8 - Streams flatMap()

文章目录 官方文档What is flatMap()?Why flat a Stream?Demo需求1&#xff1a;Find all books需求2&#xff1a;Order and LineItems需求3&#xff1a;Splits the line by spaces需求4&#xff1a; flatMap and primitive type 官方文档 https://docs.oracle.com/javase/8/…

JAVA8 中的flatmap

构建对象 class User{private String addr } 将多个User集合中的addr按照;分割合并成一个字符串list List<User> uList Lists.newArrayList();User u1 new User();u1.setAddr("a1;a2;a3;a4;a5");User u2 new User();u2.setAddr("b1;b2;b3;b4;b5&qu…

Unity resource style/Theme.AppCompat.Dialog (aka xxx:style/Theme.AppCompat.Dialog) not found

关于Unity 打包报错"resource style/Theme.AppCompat.Dialog (aka com.game.chipsmerge:style/Theme.AppCompat.Dialog) not found."的问题 解决方法: 在mainTemplate文件中添加依赖: implementation ‘com.android.support:appcompat-v7:28.0.0’ 或者自己去下载其…

android最新v7包下载,support v7 appcompat.jar包下载

android support v7 appcompat.jar包是一款非常实用的jar文件,是android开发中必备的一份文件,能够在低版本Android平台上开发一个应用程序,兼容性极强。感兴趣的朋友欢迎前来IT猫扑下载体验吧! android support v7 appcompat.jar包介绍 android-support-v7-appcompat.jar包…

解决 appcompat 1.1.0 导致 webview crash 的问题

Android SDK 太不让人省心了&#xff0c;正式版本居然也埋雷。 前段时间把 support 升级到了 androidx&#xff0c;appcompat 自动升级了新版本 androidx.appcompat:appcompat:1.1.0。 简单回归了下功能就发上线了&#xff0c;结果在在 5.1 的系统上发生了大规模的 crash&…

从AppCompat切换到MaterialComponents一些主题属性介绍

文章目录 前言主题属性颜色排版字体形状小部件ButtonsText FieldsCardsBottom Navigation 后话 前言 絮叨两句&#xff0c;感觉Component这个库有点傲娇&#xff0c;我碰到一个情景&#xff0c;使用Button&#xff0c;设置了background属性&#xff0c;当使用样式是AppCompat时…

Gradle编译问题(appcompat和material相关)

在使用Android Studio编译项目时&#xff0c;发现的编译问题。已解决&#xff0c;在此记录一下 问题1 Cant determine type for tag <macro name"m3_comp_bottom_app_bar_container_color">?attr/colorSurface</macro> 原因是androidx.appcompat:app…