/**
* Copyright (c) 2005-2012 https://github.com/zhangkaitao
*
* Licensed under the Apache License, Version 2.0 (the "License");
*/
package com.sishuok.chapter4.web.servlet.nonblocking;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
*
* 写数据客户端,{@link ReadServlet} 负责读
*
* <p>User: Zhang Kaitao
* <p>Date: 13-7-20 下午3:52
* <p>Version: 1.0
*/
@WebServlet(name = "writeClientServlet", urlPatterns = "/writeClient")
public class WriteClientServlet extends HttpServlet {
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Connection", "Keep-Alive");
resp.addHeader("Cache-Control", "private");
resp.addHeader("Pragma", "no-cache");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("正在写数据...");
resp.getWriter().flush();
resp.flushBuffer();
StringBuilder url = new StringBuilder("http://");
url.append(req.getLocalAddr());
url.append(":");
url.append(req.getLocalPort());
url.append(req.getContextPath());
url.append("/read");
HttpURLConnection conn = (HttpURLConnection) new URL(url.toString()).openConnection();
//设置是否向httpUrlConnection输出,默认false
conn.setDoOutput(true);
//设置块大小(字节),当写满后自动flush(这个用于不知道实际大小,以块的方式去写)
//sun.net.www.http.ChunkedOutputStream
conn.setChunkedStreamingMode(2);
//sun.net.www.protocol.http.HttpURLConnection#StreamingOutputStream
//设置固定长度(如文件上传,我们知道实际要传输的大小)
//conn.setFixedLengthStreamingMode(1024);
//默认是如下输出流,即写完最后自己flush,即只有最后关闭时才刷出数据
//sun.net.www.http.PosterOutputStream
//post方式提交
conn.setRequestMethod("POST");
OutputStream os = new BufferedOutputStream(conn.getOutputStream());
for(int i = 1; i <= 10 * 100; i++) {
os.write(("hello" + i).getBytes("ISO-8859-1"));
try {
if(i % 20 == 0) { //每写20次 flush下,等待1秒
os.flush();
Thread.sleep(1000L);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
os.close();//如果注释掉这行,可能导致服务器端没有读取完数据抛出java.io.EOFException,此刻将回调ReadListener#onError
conn.disconnect(); //释放连接
resp.getWriter().write("客户端写数据完成...");
resp.getWriter().flush();
resp.flushBuffer();
}
}