http回调

本文介绍了一个简单的客户端应用网络通信方案,通过自定义线程处理HTTP请求的发送与接收,并实现多连接管理。该方案适用于需要从远程服务器获取数据并及时通知客户端的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值