- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个使用分块传输编码连接到服务的客户端应用程序。该服务有时会断开连接,有人告诉我这是因为我们在请求中发送了一个零 block ,所以 Tomcat
关闭了连接。
我正在使用 Java
HttpUrlConnection
类来建立连接,我不知道为什么它会发送一个零 block 以及如何防止它这样做.
这是代码。
URL m5url = new URL("https://hostedconnect.m5net.com/bobl/bobl?name=org.m5.apps.v1.cti.ClickToDial.subscribe");
StringBuffer sb = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"standalone=\"yes\"?>"
+ "<Command>"
+ "<Name>org.m5.apps.v1.cti.ClickToDial.subscribe</Name>"
+ "<Id>1</Id>"
+ "<User>" + m5username + "</User>"
+ "<Password>" + m5password + "</Password>"
+ "<FormattedXml>true</FormattedXml>"
+ "<ShallowResponse>FULL</ShallowResponse>"
+ "</Command>");
conn = (HttpURLConnection) m5url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setReadTimeout(SESSION_TIMEOUT);
conn.setChunkedStreamingMode(0);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
out = new DataOutputStream(conn.getOutputStream());
conn.connect();
out.writeBytes(sb.toString());
out.flush();
当我执行 inputstream.readline
时,它是 null
,但有时有效,有时无效。
好的,所以我很困惑。我放弃了使用 HttpURLConnection 并开始使用 Socket 类并手动编写所有 header 和数据。在不发送零 block 的情况下,它似乎一直在工作。对于零 block ,它似乎一直在工作,除了当我在调试器中运行它时,它得到了与上面相同的错误。所以我在发送 header 之后和发送数据之前放置了一个 sleep(100) 并在没有调试器的情况下运行它并且它始终得到错误。所以我假设在 HttpURLConnection 类中发送 header 后会有延迟,这就是为什么它有时有效而其他时间无效的原因。我不能发送零 block ,但我真的很想知道为什么会导致错误。有任何想法吗?我认为 Tomcat 中存在错误。
这是代码。
public class M5Connection
{
public static final String urlBase = "/bobl/bobl";
public static final String ENCODING = "ISO-8859-1";
public static final String DELIMITER = "\r\n";
protected URL url;
private InputStream inputStream;
protected OutputStream outputStream;
protected Socket socket;
protected BufferedReader reader;
private boolean bProcessedHeaders;
protected String resp = null;
protected String errorMessage = null;
/**
* Start a new connection to the BOBL server.
* @param server server name:port to connect to
* @throws IOException
*/
protected void initConnection(String server, int timeout) throws IOException
{
url = new URL(server + urlBase);
int port = url.getPort();
if (server.startsWith("https"))
{
if (port == -1) port = 443;
else
if (port == 80 || port == -1)port = 8080;
}
if (server.startsWith("https") == false)
{
socket = new Socket(url.getHost(), port);
}
else
{
SocketFactory socketFactory = SSLSocketFactory.getDefault();
socket = socketFactory.createSocket(url.getHost(), port);
}
socket.setSoTimeout(timeout);
socket.setKeepAlive(true);
socket.setSoLinger(false, 0);
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
}
public void initHttpsConnection(String server, int timeout) throws IOException
{
initConnection(server,timeout);
sendHeaders();
bProcessedHeaders = false;
}
private void sendHeaders() throws IOException {
String path = url.getPath();
StringBuffer outputBuffer = new StringBuffer();
outputBuffer.append("POST " + path + " HTTP/1.1" + DELIMITER);
outputBuffer.append("Host: " + url.getHost() + DELIMITER);
outputBuffer.append("User-Agent: CometTest" + DELIMITER);
outputBuffer.append("Connection: keep-alive" + DELIMITER);
outputBuffer.append("Content-Type: text/plain" + DELIMITER);
outputBuffer.append("Transfer-Encoding: chunked" + DELIMITER);
outputBuffer.append(DELIMITER);
byte[] outputBytes = outputBuffer.toString().getBytes(ENCODING);
outputStream.write(outputBytes);
outputStream.flush();
}
/** Send some data to the server, HTTP/1.1 chunked style. */
public void send(String chunkData) throws IOException {
byte[] chunkBytes = chunkData.getBytes(ENCODING);
String hexChunkLength = Integer.toHexString(chunkBytes.length);
StringBuffer outputBuffer = new StringBuffer();
outputBuffer.append(hexChunkLength);
outputBuffer.append(DELIMITER);
outputBuffer.append(chunkData);
outputBuffer.append(DELIMITER);
byte[] outputBytes = outputBuffer.toString().getBytes(ENCODING);
outputStream.write(outputBytes);
outputStream.flush();
outputBuffer = new StringBuffer();
outputBuffer.append("0");
outputBuffer.append(DELIMITER);
outputBuffer.append(DELIMITER);
outputBytes = outputBuffer.toString().getBytes(ENCODING);
outputStream.write(outputBytes);
outputStream.flush();
}
/**
* Wait for a response from the server.
* @return the string that the server returned.
* @throws IOException
*/
public String getRawResponse() throws IOException
{
String s;
// just after we connect we expect to see the HTTP headers. Read and discard
if (!bProcessedHeaders) {
while (true){
String line = reader.readLine();
System.out.println("HEADER: " + line);
if (line == null || line.equals("\r\n") || line.equals(""))
break;
}
bProcessedHeaders = true;
}
while (true)
{
s = getChunk();
if (s == null)
return null;
if (s.equals("")) {
continue;
}
// server will not emit XML if it is having real troubles
if (s.charAt(0) != '<' || s.startsWith("<html>")) {
System.out.println("Server says: " + s);
continue;
}
return s;
}
}
/**
* Expect chunked excoding back from the server. Read and return a chunk.
* @return a string containing the HTTP chunk
* @throws IOException
*/
private String getChunk() throws IOException
{
StringBuffer buf = new StringBuffer();
while (true)
{
// HTTP chunked mode, expect to see a line with the length in hex of the chunk that follows
String s = reader.readLine();
if (s == null)
throw new IOException();
if (s.length() == 0)
continue;
int toread;
try {
toread = Integer.parseInt(s, 16);
} catch (NumberFormatException e) {
System.out.println("Number format error: " + s);
return "";
}
if (toread == 0)
{
return null;
}
// read the chunk
char[] data = new char[toread];
int read = 0;
while (read != toread)
{
read += reader.read(data, read, toread - read);
}
buf.append(data, 0, read);
// for some reason tomcat only sends data in up to 8192 byte chunks
if (toread != 8192)
break;
}
return buf.toString();
}
public void close()
{
try { socket.close(); } catch (IOException e) {}
}
public static void main(String[] args) throws Exception
{
M5Connection cnx = new M5Connection();
cnx.initHttpsConnection("https://hostedconnect.m5net.com/bobl/bobl?name=org.m5.apps.v1.cti.ClickToDial.subscribe", 0);
Thread.sleep(100);
//
// Create and send an XML command to listen for call state changes on our TN
//
String format = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<Command>" +
" <Name>org.m5.apps.v1.cti.ClickToDial.subscribe</Name>" +
" <Id>1</Id>" +
" <User></User>" +
" <Password></Password>" +
" <FormattedXml>true</FormattedXml>" +
" <ShallowResponse>FULL</ShallowResponse>" +
"</Command>";
String command = format;
System.out.println("SENDING " + command + "\n ------------ ");
cnx.send(command);
//
// Now just wait for the responses
//
while (true)
{
String resp = cnx.getRawResponse();
System.out.println(resp);
}
}
}
最佳答案
I was told it was because we're sending a zero chunk in the request
你被误导了。最后一个 chunk 为 0 是正确的,表示传输结束。参见 RFC 2616 #3.6.1 .发送一个没有错,Tomcat 不应该(而且几乎肯定不会)通过关闭连接来使用react。
关于java - HTTP 分块传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115069/
我正在使用 WCF 并希望将大文件从客户端上传到服务器。我已经调查并决定遵循 http://msdn.microsoft.com/en-us/library/aa717050.aspx 中概述的分块方
我试图了解有关 Transfer-Encoding:chunked 的更多信息。引用了一些文章: http://zoompf.com/blog/2012/05/too-chunky和 "Transfe
我们正在评估 HDF5 在分块数据集方面的性能。 特别是我们试图弄清楚是否可以跨不同的连续块进行读取以及这样做会如何影响性能? 例如。我们有一个块大小为 10 的数据集,一个有 100 个值的数据集,
使用 Eloquent,如何根据 chunk 中的条件终止分块函数的关闭?我试过返回,但这似乎只终止当前块而不是所有块。此时,我想停止从数据库中检索记录。 $query->chunk(self::CH
有没有办法在不删除所选文件的情况下重新启动 plupload 上传? plupload.stop() 停止上传,但如果我使用 start() 再次启动上传,它会从上次停止的地方继续。相反,我希望它再次
我有带有“id,名称”的文件1和带有“id,地址”的文件2。我无法加载第一个文件(小于 2Gb):它在 76k 行(带有 block 连接)和只有 2 列后崩溃...我也无法在第二个文件上 read_
我正在尝试从头开始设计一个系统,我想在其中通过 servlet 加载文本行。生产线的生产需要一些时间。因此,我希望能够在它们到达时在我的浏览器中逐步显示它们,一次显示几个。我想从 javascript
能否请您提供一个示例,说明如何在 Android 中读取来自 Web 服务的分块响应 谢谢 编辑:我尝试调用一个 soap 网络服务,它用代表图像的 base64 编码字符串回复我 代码如下: Str
我想制作一个无限平铺 map ,从(-max_int,-max_int)到(max_int,max_int),所以我要制作一个基本结构: chunk,每个 chunk 包含 char tiles[w]
这是一个典型的场景:评估一个页面,并且有一个缓冲区 - 一旦缓冲区已满,评估的页面部分就会发送到浏览器。这使用 HTTP 1.1 分块编码。 但是,其中一个 block 中可能会发生错误(在第一个 b
如何从给定模式的句子中获取所有 block 。例子 NP:{} 标记的句子: [("money", "NN"), ("market", "NN") ("fund", "NN")] 如果我解析我得到 (
我正在使用以下代码将 CSV 文件拆分为多个 block (来自 here) def worker(chunk): print len(chunk) def keyfunc(row):
我想我已经很接近这个了,我有以下 dropzone 配置: Dropzone.options.myDZ = { chunking: true, chunkSize: 500000, ret
因为我在更常规的基础上使用 WebSocket 连接,所以我对事情在幕后的工作方式很感兴趣。因此,我研究了无休止的规范文档一段时间,但到目前为止,我真的找不到任何关于对传输流本身进行分 block 。
我有一个 slice ,其中包含约 210 万个日志字符串,我想创建一个 slice ,字符串尽可能均匀分布。 这是我目前所拥有的: // logs is a slice with ~2.1 mill
问题: 我有一个大约为 [350000, 1] 的向量,我希望计算成对距离。这导致 [350000, 350000] 整数数据类型的矩阵不适合 RAM。我最终想得到一个 bool 值(适合 RAM),
我想将 JSONP 用于具有 x 域脚本编写的项目,但不太关心 IE 中的 2048 个字符限制。 如果字符大小超过 2048,JSONP 是否自动支持“分块”?如果是的话,有人可以分享一些例子吗?
我目前正在开发 2d 角色扮演游戏,例如《最终幻想 1-4》。基本上,我的平铺 map 可以加载, Sprite 可以在 map 上自由行走。 如何处理与平铺 map 的碰撞? 我创建了三个独立的图
Treetagger 可以进行词性标记和文本分块,这意味着提取口头和名词性从句,如这个德语示例所示: $ echo 'Das ist ein Test.' | cmd/tagger-chunker-g
我应该从服务器流式传输端点,该端点返回带有传输编码的 json:分块。 我有以下代码,但无法读取响应。我尝试了 responseBody.streamBytes() 并将输入流转换为字符串,但我不能在
我是一名优秀的程序员,十分优秀!