@SpringBootApplication
@RestController
public class HttpChunkedApplication {
public static void main(String[] args) {
SpringApplication.run(HttpChunkedApplication.class, args);
}
@PostMapping("/home/getMsg")
public ChunkedRsp login( HttpServletResponse response ){
return new ChunkedRsp("aaa","bbb","ccc");
}
}
@Data
public class ChunkedRsp {
private String A;
private String B;
private String C;
public ChunkedRsp(String a, String b, String c) {
A = a;
B = b;
C = c;
}
}
运行应用程序,然后
- sudo tcpdump -i any -nnAls0 port 8080
- curl -X POST http://0.0.0.0:8080/home/getMsg
tcpdump显示两个数据包:当我curl
时,tcp转储数据包你所描述的正是分块编码应该如何工作的(参见Wikipedia):
- 每个chunk都以其长度(十六进制)和
rn
为前缀, - 序列
0rnrn
表示消息结束。
发送的TCP段的数量取决于您的TCP/IP堆栈(操作系统)。如果连接是slow如果TCP_NO_DELAY
选项为false,则段将被合并:参见这个问题。
Tomcat默认将套接字上的TCP_NO_DELAY
选项设置为true
(参见文档)。要禁用它,请修改连接器配置:
<Connector port="8080"
socket.tcpNoDelay="false"
... />
并在真实连接上测试您的服务器(而不是环回设备127.0.0.1
,它非常快)。