Hallo,
ich versuche gerad mehrere Verbindungen in einem Thread mit httpcore-nio zu verarbeiten. Ich hab mich an dem Beispiel http://hc.apache.org/httpcomponents...org/apache/http/examples/nio/NHttpClient.java entlang gehangelt, jedoch werden meine Anfragen nacheinander abgearbeitet. Das sieht dann so aus:
Die Datei ist jeweils etwa 1mb groß, also sollte sie eigentlich einen Moment für die Übertragung benötigen. Verwende ich mehrere Threads, werden auch mehrere Dateien parallel übertragen.
Ich verstehe nicht, warum das nicht funktioniert!
Kann mir da jemand helfen?
Gruß,
Olli
ich versuche gerad mehrere Verbindungen in einem Thread mit httpcore-nio zu verarbeiten. Ich hab mich an dem Beispiel http://hc.apache.org/httpcomponents...org/apache/http/examples/nio/NHttpClient.java entlang gehangelt, jedoch werden meine Anfragen nacheinander abgearbeitet. Das sieht dann so aus:
Code:
[HTTP] attempting to open http://127.0.1.2:80/bild.zip
[HTTP] attempting to open http://127.0.2.3:80/bild.zip
[HTTP] attempting to open http://127.0.0.1:80/bild.zip
[HTTP] HTTP/1.1 200 OK
[HTTP] Request finished
[HTTP] HTTP/1.1 200 OK
[HTTP] Request finished
[HTTP] HTTP/1.1 200 OK
[HTTP] Request finished
Die Datei ist jeweils etwa 1mb groß, also sollte sie eigentlich einen Moment für die Übertragung benötigen. Verwende ich mehrere Threads, werden auch mehrere Dateien parallel übertragen.
Ich verstehe nicht, warum das nicht funktioniert!
Kann mir da jemand helfen?
Gruß,
Olli
Java:
import java.io.IOException;
import java.io.InterruptedIOException;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.nio.DefaultHttpClientIODispatch;
import org.apache.http.impl.nio.pool.BasicNIOConnPool;
import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
import org.apache.http.impl.nio.reactor.IOReactorConfig;
import org.apache.http.nio.client.methods.AsyncByteConsumer;
import org.apache.http.nio.client.methods.HttpAsyncMethods;
import org.apache.http.nio.protocol.HttpAsyncRequestExecutor;
import org.apache.http.nio.protocol.HttpAsyncRequester;
import org.apache.http.nio.reactor.IOReactorException;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.params.SyncBasicHttpParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpProcessor;
import org.apache.http.protocol.ImmutableHttpProcessor;
import org.apache.http.protocol.RequestConnControl;
import org.apache.http.protocol.RequestContent;
import org.apache.http.protocol.RequestExpectContinue;
import org.apache.http.protocol.RequestTargetHost;
import org.apache.http.protocol.RequestUserAgent;
public class HTTPClient {
private BasicNIOConnPool pool;
private HttpAsyncRequester requester;
private DefaultConnectingIOReactor ioReactor;
private DefaultHttpClientIODispatch ioEventDispatch;
public HTTPClient() throws IOException {
init();
}
private void init() throws IOReactorException {
// HTTP parameters for the client
HttpParams params = new SyncBasicHttpParams();
params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 3000)
.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000)
.setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 32 * 1024)
.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
.setParameter(CoreProtocolPNames.USER_AGENT, "Test/1.1");
// Create HTTP protocol processing chain
HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[] {
// Use standard client-side protocol interceptors
new RequestContent(), new RequestTargetHost(), new RequestConnControl(), new RequestUserAgent(),
new RequestExpectContinue() });
// Create client-side HTTP protocol handler
HttpAsyncRequestExecutor protocolHandler = new HttpAsyncRequestExecutor();
// Create client-side I/O event dispatch
ioEventDispatch = new DefaultHttpClientIODispatch(protocolHandler, params);
// Create client-side I/O reactor
IOReactorConfig config = new IOReactorConfig();
config.setIoThreadCount(1);
ioReactor = new DefaultConnectingIOReactor(config);
// Create HTTP connection pool
pool = new BasicNIOConnPool(ioReactor, params);
pool.setDefaultMaxPerRoute(8);
pool.setMaxTotal(64);
requester = new HttpAsyncRequester(httpproc, new DefaultConnectionReuseStrategy(), params);
}
public void execute(HttpGet request, AsyncByteConsumer<Boolean> consumer) {
requester.execute(HttpAsyncMethods.create(request), consumer, pool, new BasicHttpContext());
}
public void start() {
new Thread(new Runnable() {
public void run() {
try {
ioReactor.execute(ioEventDispatch);
} catch (InterruptedIOException ex) {
System.err.println("[HTTP] Interrupted");
} catch (IOException e) {
System.err.println("[HTTP] I/O error: " + e.getMessage());
}
System.out.println("[HTTP] Shutdown");
}
}).start();
}
public void stop() {
try {
ioReactor.shutdown();
} catch (IOException e) {
// ignore
}
}
}