在做客户端应用时, 经常遇到联网, 需要获取远端服务的response, 在数据返回时通知给客户端,在此做下记录。
1. 建一个线程, 处理发送和接收
//仅供备忘 , 需要完善的还有连接数控制,流处理,请求附加码,连接百分比等
abstract class Http implements Runnable {
public boolean isDisconnect = false;
private Thread thread;
private HttpURLConnection httpUrlConnection;
private URL Url;
public Http http;
private int state;
//保存连接
private List<HttpURLConnection> connections;
private InputStream inputStream;
private ArrayList<HttpURLConnection> removeAble = null;
public Http() {
System.out.println("---->Http Constructor<---");
http = this;
connections = new ArrayList<HttpURLConnection>();
thread = new Thread(this);
thread.start();
}
@Override
public void run() {
String path = "";
while (!isDisconnect) {
try {
Thread.sleep(10);
int cnt = 1;
for (HttpURLConnection conn : connections) {
path = conn.getURL().toString();
System.out.println("正在连接第" + cnt + "个, " + path);
inputStream = conn.getInputStream();
if (inputStream != null) {
System.out.println("正在读取:" + path);
onHttp(inputStream, path, conn.getResponseCode());
inputStream.close();
inputStream = null;
if (removeAble == null) {
removeAble = new ArrayList<HttpURLConnection>();
}
removeAble.add(conn);
}
cnt++;
}
// remove
if (removeAble != null) {
for (HttpURLConnection conn : removeAble) {
popConnect(conn);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public boolean get(String url) {
try {
Url = new URL(url);
httpUrlConnection = (HttpURLConnection) Url.openConnection();
httpUrlConnection.setRequestMethod("GET");
httpUrlConnection.setDoOutput(true);
httpUrlConnection.setConnectTimeout(10 * 1000);
pushConnect(httpUrlConnection);
System.out.println(connections.size());
Url = null;
httpUrlConnection = null;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
public boolean post(String url, byte[] buff) {
return true;
}
private void pushConnect(HttpURLConnection http) {
// for (HttpURLConnection h : connections) {
// String h1 = null;
// String h2 = null;
// h1 = h.getURL().getPath();
// h2 = http.getURL().getPath();
// if (h1.equals(h2)) {
// return;
// }
// }
this.connections.add(http);
}
private void popConnect(HttpURLConnection obj) {
synchronized (this) {
connections.remove(obj);
}
}
public abstract void onHttp(InputStream inputStream, String url, int code);
}
class HttpClient extends Http{
@Override
public void onHttp(...){
//在此事件里处理返回的流
}
}