Android网络编程

一 JOSN简介

JSON:JavaScript对象表示法(JavaScript Object Notation),JSON 是存储和交换文本信息的语法。类似 于XML,但 比 XML 更小、更快,更易解析,JOSN应用在android网络编程用于请求和响应的报文。

JOSN语法: 

  • 数据保存在在键/值对中,如firstname:John表示一对数据;
  • 数据由逗号分隔,如firstname:John,lastname:Doe表示两对数据
  • 花括号保存对象 ,如{firstname:John,lastname:Doe}代表一个对象 
  • 方括号保存数组,如[{firstname:Johnlastname:Doe},{firstname:John,lastname:Doe},{firstname:John,lastname:Doe}]表示一个数组中含有三个对象;
  • JOSN可以嵌套,如{"employees:[{firstname:Johnlastname:Doe},{firstname:John,lastname:Doe},{firstname:John,lastname:Doe}]"}表示对象employees是包含三个对象的数组

HTTP和Socket的区别

  • socket是对TCP/IP协议的封装和应用,主要解决数据如何在网络中传输,相当于只是TCP的一个接口工程序员调用;而HTTP是应用层协议,主要解决如何包装数据然后再传输;
  • socket是长连接,客户端和服务端只有其中一端断开,连接才会断开;HTTP是短连接,都是客户端主动请求、服务器响应后就断开连接(三次握手);
  • socket可以自由选择用TCP或UDP传输数据;而HTTP只能使用TCP协议传输数据;

三 HTTP编程

HTTP协议是被广泛使用的一种网络协议, 是一个 客户端 服务器 端请求和应答的标准,关于它的标准已经确定好了,但通过代码来实现HTTP连接在android上可以有不同的方式,在android SDK中规定使用HTTP协议可以有两种方式:

1.通过java.net中的HttpURLConnection来实现;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button = (Button) findViewById(R.id.button);
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {	
				new Thread(){
					public void run() {		
						doHttpRequest(new IFinish() {	
							@Override
							public void onFinished(byte[] bytes) {
								try {
									doParse(new String(bytes,"GBK"));
								} catch (UnsupportedEncodingException e) {
									e.printStackTrace();
								}
							}	
							@Override
							public void onFailed(Exception e) {
								Log.i(TAG, e.getMessage());
							}
						});	
					};
				}.start();
			}
		});
	}
	private void doHttpRequest(IFinish onFinish){
		
		HttpURLConnection conn = null;
		BufferedOutputStream bos = null;
		BufferedInputStream bis = null;
		HashMap heads = null;
		try {
			URL url = new URL(RED_URL);
			
			conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setRequestMethod("POST");
			
			heads = getHashMap();
			if(heads != null){
				Iterator iterator = heads.entrySet().iterator();
				while(iterator.hasNext()){
					Entry entry = (Entry) iterator.next();
					conn.setRequestProperty(entry.getKey().toString(), entry.getValue().toString());
				}
			}
			conn.connect();
			
			bos = new BufferedOutputStream(conn.getOutputStream());
			bos.write(getRequestStr().getBytes());
			bos.flush();
			
			InputStream is = null;
			is = conn.getInputStream();
			bis = new BufferedInputStream(is);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			int b = 0;
			while((b=bis.read())!=-1){
				baos.write(b);
			}
			onFinish.onFinished(baos.toByteArray());

		} catch (IOException e) {
			e.printStackTrace();
			onFinish.onFailed(e);
		} finally{
			try {
				bos.close();
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

这里的代码只贴出了关于网络请求中关键的代码,其他的请求的数据细节和解析数据内容就不贴出来了;其中conn.setRequestProperty必须在conn.connect()前调用;

2.通过Android SDK附带Apache包中的HttpClient来实现;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值