`
chenpeilei2003
  • 浏览: 187384 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

http回调

阅读更多

在做客户端应用时, 经常遇到联网, 需要获取远端服务的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(...){
    //在此事件里处理返回的流
 }
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics