我试图通过单个套接字连接发送多个HTTP POST,但是一旦我读取输入流就打破了EPIPE。
mBufferedWriter.write("POST " + "/base/mypath" + " HTTP/1.1" + "\r\n");
mBufferedWriter.write("Host: " + mIp + "\r\n");
mBufferedWriter.write("Content-Length: " + json.toString().length()"\r\n");
mBufferedWriter.write("Content-Type: application/json\r\n");
mBufferedWriter.write("Connection: Keep-Alive\r\n\r\n");
mBufferedWriter.write(json.toString() + "\r\n");
mBufferedWriter.flush();
我的第一个POST将到达服务器。我试图实现流水线操作。设置socket的keep-alive
答案 0 :(得分:3)
HTTP Pipelining不仅仅涉及重用现有连接(HTTP Keep-Alive)。管道传输涉及同时在单个连接上传输多个HTTP请求,其中客户端发送HTTP请求但在同一连接上发送下一个HTTP请求之前不等待其响应。客户端和服务器都必须实现对流水线的支持才能有效地使用它。即使这样,也存在与管道POST
请求相关的问题,因此它们应该是流水线的。 RFC 2616章节HTTP Pipelining和8.1.1中讨论了8.1.2.2。
如果你实际上没有实现Pipelining,只有Keep-Alive,那么你必须注意服务器的Connection
响应头,因为它告诉你是否允许你通过它发送一个新的HTTP请求连接与否。对于HTTP 1.1响应,如果服务器发送Connection: close
标头,则服务器在发送响应后将关闭套接字,因此您必须在发送下一个HTTP请求之前创建新连接
答案 1 :(得分:0)
您可以使用Apache HTTP客户端(http://hc.apache.org/httpcomponents-client-ga/)或http://developer.android.com/reference/org/apache/http/client/package-summary.html并设置线程安全客户端连接管理器。