【发布时间】:2024-01-09 16:46:01
【问题描述】:
我使用 DefaultHttpClientConnection 发送 http post 请求。是否可以重用http连接?例如,实例化并建立连接并将套接字绑定到它,然后将其分配给类中的静态字段。然后,对于发送 http 帖子的每个函数调用,我将重用我之前设置的相同 DefaultHttpClientConnection。我试图以这种方式重用它,但我不断收到 HTTPException 说我有无效的协议。如果我实例化一个新的 DefaultHttpClientConnection 并在每次发送帖子时设置它,该代码就可以工作,但每当我尝试提高效率并重用它时,我都会遇到该异常。
这是在 Java 中。
/*
* These settings shall speed up the sending of the http request...
* */
BasicHttpParams params = new BasicHttpParams();
//Use HTTP 1.1 so we open a TCP connection per request sent
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
//Turn off Nagle's Algorithm to speed things up
HttpConnectionParams.setTcpNoDelay(params, true);
params.setBooleanParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);
params.setBooleanParameter(HttpConnectionParams.STALE_CONNECTION_CHECK, false);
params.setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE, 8 * 1024);
client.setParams(params);
DefaultConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
HttpResponse resp = null;
if (conn == null)
{
executor = new HttpRequestExecutor();
context = new BasicHttpContext();
httpproc = new BasicHttpProcessor();
/*Set http connection processors, mostly default settings
* What these protocols do, can be easily found online ;) */
httpproc.addInterceptor(new RequestContent());
httpproc.addInterceptor(new RequestTargetHost());
// Recommended protocol interceptors
httpproc.addInterceptor(new RequestConnControl());
httpproc.addInterceptor(new RequestUserAgent());
httpproc.addInterceptor(new RequestExpectContinue());
}
conn = new DefaultHttpClientConnection();
if (!conn.isOpen())
{
//Opening the socket
try
{
socket = new Socket(request.getURI().getHost(), request.getURI().getPort());
try
{
//Bind socket to the connection
TTLog.log("connection binding to socket...");
conn.bind(socket, client.getParams());
}
catch (IOException e1)
{
TTLog.log("Failed to bind the socket to the HTTPConnection...");
e1.printStackTrace();
}
}
catch (UnknownHostException e1)
{
TTLog.log("The host name is invalid... Hostname: " + request.getURI().getHost());
e1.printStackTrace();
}
catch (IOException e1)
{
TTLog.log("I/O Error when creating socket...");
e1.printStackTrace();
}
}
这是一个例外:
org.apache.http.ProtocolException: Not a valid protocol version: ??)»L 在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:181) 在 org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:185) 在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:284) 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:126)
【问题讨论】:
-
这段代码是我目前完成连接设置的方式。每次调用该方法时,我都会创建一个新的 DefaultHttpClientConnection。试图避免这种情况并将 DefaultHttpClientConnection 保留在类中的静态变量上。
-
很抱歉。我编辑了这个问题,但我尝试重用时遇到了异常。
-
执行 executor.execute 时发生异常。
-
1.编辑问题后删除过时的 cmets。 2. 你的代码不完整:发布一个*.com/help/mcve 包括任何导入语句,这样我们就不必猜测你使用了哪些类。您的代码也没有显示您调用它的频率以及调用之间可能发生的情况。 3. 你创建了那个执行器,但从来没有用它做任何事情——发布你的实际代码。
标签: java apache http-headers httprequest httpclient