一 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来实现;