java发送chunked数据_如何从java servlet中的chunked响应中发送Http预告片/页脚?
我最终为此编写了一个简单的单线程Web服务器.原来这很容易.服务器很简单.虽然代码有点粗糙,但主要的想法是存在的.
它的作用是将filecontents作为第一个块发送,并将文件的校验和作为页脚发送.
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
public class ChunkedResponseServer implements Runnable {
private static final Logger LOGGER = Logger.getLogger(ChunkedResponseServer.class);
// Space ' '
static final byte SP = 32;
// Tab ' '
static final byte HT = 9;
// Carriage return
static final byte CR = 13;
// Line feed character
static final byte LF = 10;
final int port;
private volatile boolean cancelled = false;
public ChunkedResponseServer(int port) {
LOGGER.info("Chunked response server running on port " + port);
this.port = port;
}
@Override
public void run() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
while (!cancelled) {
final Socket connectionSocket = serverSocket.accept();
handle(connectionSocket);
}
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
public void cancel() {
LOGGER.info("Shutting down Chunked response Server");
cancelled = true;
}
private void handle(Socket socket) throws IOException {
BufferedReader input = null;
DataOutputStream output = null;
try {
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
output = new DataOutputStream(socket.getOutputStream());
addHeaders(output);
addCRLR(output);
final String filename = readFilename(input);
final byte[] content = readContent(filename);
addContentAsChunk(output, content);
final String checksum = DigestUtils.md5Hex(content);
addLastChunkAndChecksumFooter(output, checksum);
addCRLR(output);
} finally {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(output);
}
}
private void addLastChunkAndChecksumFooter(DataOutputStream output, String checksum) throws IOException {
output.writeBytes("0");
addCRLR(output);
output.writeBytes("checksum: " + checksum);
addCRLR(output);
}
private void addContentAsChunk(DataOutputStream output, byte[] content) throws IOException {
output.writeBytes(Integer.toHexString(content.length));
addCRLR(output);
output.write(content);
addCRLR(output);
}
private void addCRLR(DataOutputStream output) throws IOException {
output.writeByte(CR);
output.writeByte(LF);
}
private void addHeaders(DataOutputStream output) throws IOException {
output.writeBytes("HTTP/1.1 200 OK");
addCRLR(output);
output.writeBytes("Content-type: text/plain");
addCRLR(output);
output.writeBytes("Transfer-encoding: chunked");
addCRLR(output);
output.writeBytes("Trailer: checksum");
addCRLR(output);
}
private String readFilename(BufferedReader input) throws IOException {
final String initialLine = input.readLine();
final String filePath = initialLine.split(" ")[1];
final String[] components = filePath.split("/");
return components[components.length - 1];
}
private byte[] readContent(String filename) throws IOException {
final InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename);
return IOUtils.toByteArray(in);
}
}
java发送chunked数据_如何从java servlet中的chunked响应中发送Http预告片/页脚?相关推荐
- java读取网络图片数据_如何利用java读取网络照片
如何利用java读取网络照片 Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的`编程.以下是小编为大家搜索整理的如何利用java读取网络照片, ...
- ashx文件与ajax,ashx文件猎取$.ajax()方法发送的数据_
<ashx文件猎取$.ajax()方法发送的数据_>由会员分享,可在线阅读,更多相关<ashx文件猎取$.ajax()方法发送的数据_(7页珍藏版)>请在人人文库网上搜索. 1 ...
- 投行数据_投行对Java的二十大核心访谈问答
投行数据 这是在金融领域(主要是在大型投资银行)共享Java核心访谈问题和答案的新系列. 在JP Morgan,Morgan Stanley,Barclays或Goldman Sachs上会问许多这些 ...
- java 读取mysql数据_使用java从mysql数据库读取数据
首先,我正在使用jTextFields阅读用户的产品名称和产品数量.对于该产品,我使用sql查询从数据库中读取产品ID和价格.但是在下面的代码中我在jtextField中显示产品价格,但是在运行tha ...
- java io 网络编程_[笔面] Java IO和网络编程相关面试
1.网络编程时的同步.异步.阻塞.非阻塞? 同步:函数调用在没得到结果之前,没有调用结果,不返回任何结果. 异步:函数调用在没得到结果之前,没有调用结果,返回状态信息. 阻塞:函数调用在没得到结果之前 ...
- java同步异步调用_详解java 三种调用机制(同步、回调、异步)
1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...
- 新手学java 学哪方面_初学者学Java应从哪些方面学习?
原标题:初学者学Java应从哪些方面学习? Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.那么,初学者学Java应从哪些方面学 ...
- java导致系统满载_排查解决java进程占用系统内存高
使用top命令查看系统资源的使用情况 top 获取java的PID 或者 jps -l jps -v 通过命令查看进程的线程情况 **ps p pid-L -o pcpu,pmem,pid,tid,t ...
- java 密码加密 盐_有效提高java编程安全性的12条黄金法则
安全性是软件开发中最复杂,最广泛和最重要的考量之一.Java是具有许多内置安全性功能的开发平台,java在长期的发展过程中,已经经过了很多高强度的安全测试,并经常更新安全漏洞.并且Java生态系统还包 ...
最新文章
- 关于Netty的ByteBuff内存泄漏问题
- php 接收文件 错误代码3,php上传文件错误代码3
- vue隐藏浏览器_一分钟学会Vue的条件渲染和列表渲染
- 单链表遍历_单链表及其遍历实现的基本操作
- 骨牌铺方格(HDU-2046)
- Python与Java曝漏洞,黑客利用FTP注入攻击可绕过防火墙
- github因网络问题无法git clone解决办法
- chrome的cookies
- 关于 C# select 读取 Excel 数据 为空,或成科学计数法解决方案
- 主动学习、纯半监督学习与直推学习
- C# NPOI导出Excel表格 公式不计算
- win10 删除右键显卡菜单项
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十一课:Cocos2D-X网格特效1-3
- Visual studio2022“无法生成.exe文件,系统找不到指定文件
- jquery控制div的显示与隐藏
- Luckysheet 导入导出 - Java后台处理和js前端实现
- 浏览器加载网页的过程
- 设计模式是什么鬼3(原型)
- 【UE4从零开始 027】插槽 Slot
- Android切换深色模式导致布局字体变小的解决方案