使用HttpURLConnection从网络上获取数据
1. 在mainfest.xml中添加网络访问权限,代码如下:
<uses-permission android:name="android.permission.INTERNET"/>"
2. 给定一个数据url,通过该URL得到一个Http链接,再通过链接获得输入流,读取该网站的数据。核心代码如下:
URL url=new URL(urlstring);
URLConnecion conn=url.openConnecion();//打开连接
if((conn instanceof HttpURLConnecion)){
throw new IOException("Not an HTTP Connecion");
}
HttpURLConnecion httpConn=(HttpURLConnection)conn;
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequstMethod("GET");
httpConn.connect();
int response=httConn.getResponseCode();
if(response==HttpURLConnection.HTTP_OK){
in=httpConn.getInputStream();
}
3. 通过得到的输入流,来获取数据。如果想获得字符数据,则将该输入流封装成字符输入流。如果想得到图片,则可以封装成位图。代码如下:
得到位图
bitmap=BitmapFactory.decodeStream(in);
转为字符输入流的方法和java的方式一样
因为从网络上下载数据属于耗时操作,应该另开一个线程来处理此任务,而通常我们使用AsyncTask来处理。在doInBackground(string …urls)方法中获得位图,在onPostExcute(Bitmapbitmap)中更新UI。
使用HttpClient来从网络上获取数据
HttpClient是Apache的一个开源项目,弥补了上述方法(通过HttpURLConnection建立连接)灵活性不足的特点,为客户端基于Http协议的编程提供了高效、功能丰富的工具包的支持。Android SDK引入了HttpClient之后,对其作了一些扩展和封装,例如设置默认的Http超时时间以及缓存大小等。HttpClient的一般使用步骤如下:
1. 使用DefaultHttpClient类实例化HttpClient对象。
2. 创建HttpGet或者是HttpPost对象,将要请求的URL通过构造方法传入HttpGet和HttpPost对象。
3. 调用excute方法发送Http Get(获取资源)或者Http Post(提交表单)请求,并返回HttpResponse对象。具体代码如下:
httpGet的使用方法:
HttpClient client=new DefaultHttpClient();
HttpGet request=new HttpGet(url);
HttpResponse response=client.excute(request);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
{
InputStream in=response.getEntity().getContent();
}
httpPost的使用方法:
HttpClient client=new DefaultHttpClient();
HttpPost request=new HttpPost(url);
//准备表单,表单项是一个NameValuePair
List<NameValuePair> postParameters=new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("id","123456"));
postParameters.add(new BasicNameValuePair("name","mike"));
UrlEncodedFormEntity formEntity=new UrlEncodedFormEntity(postParameters);
request.setEntity(formEntity);
HttpResponse response=client.excute(request);
使用Android Tcp Socket来进行设备之间的通信
上面两种方法都是对网络数据进行请求,并没有解决设备间的通信问题。Socket是用来描述网络上一个设备中的一个进程或应用程序的,有ip地址和端口号组成。通常情况下,socket通信有两部分,一部分为监听的server端,另一部分为主动发起请求的Client端。Server端在绑定端口号后会一直监听直到接受到连接请求为止,当Client端通过制定主机号和端口号发起请求时,Server端就会给与应答并返回一个Socket对象。之后,Server端就可以和Client端通过这个Socket来进行通信。
Server端核心代码:
ServerSocket server=new ServerSocket(18888);//绑定端口号,开始监听客户端请求
while(true){//循环监听客户端的连接请求
socket=server.accept();//接受客户端请求,返回一个socket对象
InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();
in.close();//当前客户端不需要再进行连接
out.close();
}
Client端核心代码:
Socket socket=new Socket("192.168.1.1",18888);//请求建立连接
InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();