package org.pasif.client.http;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.DefaultHttpClientConnection;
import org.apache.http.message.BasicHttpEntityEnclosingRequest;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.BasicHttpProcessor;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpRequestExecutor;
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;
import org.pas.log.LogHandlerImpl;
public class HttpSendClient {
private String host;
private int port;
private LogHandlerImpl log;
public HttpSendClient(String host, int port, LogHandlerImpl log) {
this.host = host;
this.port = port;
this.log = log;
}
public void send(String folder, String file) {
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
BasicHttpProcessor httpproc = new BasicHttpProcessor();
// Required protocol interceptors
httpproc.addInterceptor(new RequestContent());
httpproc.addInterceptor(new RequestTargetHost());
// Recommended protocol interceptors
httpproc.addInterceptor(new RequestConnControl());
httpproc.addInterceptor(new RequestUserAgent());
httpproc.addInterceptor(new RequestExpectContinue());
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
BasicHttpContext context = new BasicHttpContext(null);
HttpHost httpHost = new HttpHost(host, port);
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
DefaultConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, httpHost);
FileEntity fileEntity = null;
if (!file.equals("--end--")) {
log.info("开始传输文件:" + file, true);
fileEntity = new FileEntity(new File(folder + file), "UTF-8");
try {
if (!conn.isOpen()) {
Socket socket = new Socket(httpHost.getHostName(), httpHost.getPort());
conn.bind(socket, params);
}
BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", file);
request.setEntity(fileEntity);
context.setAttribute(ExecutionContext.HTTP_REQUEST, request);
request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
if (!connStrategy.keepAlive(response, context)) {
conn.close();
}
} catch (Exception e) {
log.error(e.getMessage(), true);
} finally {
try {
conn.close();
} catch (Exception e) {
log.error(e.getMessage(), true);
}
log.info("传输文件:" + file + "完毕。", true);
}
} else {
File f = new File("end");
try {
f.createNewFile();
fileEntity = new FileEntity(f, "UTF-8");
} catch (IOException ex) {
}
try {
if (!conn.isOpen()) {
Socket socket = new Socket(httpHost.getHostName(), httpHost.getPort());
conn.bind(socket, params);
}
BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", file);
request.setEntity(fileEntity);
context.setAttribute(ExecutionContext.HTTP_REQUEST, request);
request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
if (!connStrategy.keepAlive(response, context)) {
conn.close();
}
} catch (Exception e) {
log.error(e.getMessage(), true);
} finally {
try {
conn.close();
} catch (Exception e) {
log.error(e.getMessage(), true);
}
}
f.delete();
}
}
}