安卓网络编程

这几天一直在搞跟网络编程相关的东西,这里整理了一下关于socket网络编程以及http协议的基本用法。省的自己以后再用或者其他人学习方便。

首先是基于socket的网络编程

android的网络编程部分,基本上和java的网络编程时一样的,基本上也分成两种,一种是基于socket的,另外一种是基于http协议的。

基于Socket的基本用法,跟Java里面的用法一样,简单回顾一下:

一:服务端 1:启动一个服务器端的socket:ServerSocket server = new ServerSocket(1234); 2:开始侦听请求:Socket client = server.accept(); 3:取得输入和输出流: 4:然后就可以通过流来进行网络传输了 5:最好要记得关闭流和Server 

ServerSocket server=new ServerSocket(1234);
Socket client=server.accept();
InputStream in = client.getInputStream();
OutputStream out=client.getOutputStream();
byte bs[] = new byte[1024];
in.read(bs);
String str= new String(bs);
System.out.println(str);
out.write("Server send".getBytes());
out.flush();
client.close();

二:客户端: 1:发起一个socket连接:Socket server = new Socket("192.168.1.2",1234); 2:取得输入和输出流: 3:然后就可以通过流来进行网络传输了 4:最好要记得关闭流和Socket 

String str = "client send";out.write(str.getBytes());out.flush();byte bs[] = new byte[1024];in.read(bs);System.out.println(new String(bs));server.close();

当然这样实现很不好,应该包装成上层的流或者Reader、Writer来做。 

包装成Reader和Writer的服务端示例:

ServerSocket server=new ServerSocket(1234);Socket client=server.accept();BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));PrintWriter out=new PrintWriter(client.getOutputStream());String str=in.readLine();System.out.println(str);out.println("Server send");out.flush();

包装成Reader和Writer的客户端示例:

Socket server = new Socket("192.168.0.100", 1234);BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));PrintWriter out = new PrintWriter(server.getOutputStream());String str = "client send";out.println(str);out.flush();System.out.println(in.readLine());server.close();

使用HttpURLConnection

基于Http协议的基本用法,可以使用HttpURLConnection,也可以使用Apache的Http操作包,具体的使用方式下面分别来示例。 

要让应用使用网络,需要在Manifest文件中添加权限:

<uses-permission android:name="android.permission.INTERNET" />HttpURLConnection默认使用get的方式与后台交互HttpURLConnection conn = null;try {URL  u = new URL("http://192.168.0.100:8080/test.jsp?uuid=123");conn = (HttpURLConnection)u.openConnection();BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = "";while((line=br.readLine())!=null){Log.i("NetTest","lien="+line);}} catch (Exception e) {e.printStackTrace();}finally{ conn.disconnect();}

请注意一点,在Android3.0以上的版本里面,已经不允许直接在Activity里面进行网络的处理了,建议使用后台线程或者是干脆新建一个线程来运行,比如:

Thread t =new Thread(new Runnable() {public void run() {//上面的代码}});t.start();

或者:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork() // or// .detectAll()// for// all// detectable// problems.penaltyLog().build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());HttpURLConnection使用Post的方式与后台交互,下载数据部分跟上一个示例是一样的,麻烦在于上传数据到服务器,需要进行设置和处理,如下:
URL  u = new URL("http://192.168.0.100:8080/test.jsp");conn = (HttpURLConnection)u.openConnection();//因为这个是post请求,下面两个需要设置为trueconn.setDoOutput(true);conn.setDoInput(true);// 设置以POST方式conn.setRequestMethod("POST");// Post 请求不能使用缓存conn.setUseCaches(false);conn.setInstanceFollowRedirects(true);// 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");//DataOutputStream流DataOutputStream out = new DataOutputStream(conn.getOutputStream());//要上传的参数String content = "uuid=" + URLEncoder.encode("post测试", "utf-8");//将要上传的内容写入流中out.writeBytes(content);//刷新、关闭out.flush();out.close();

使用Apache的Http操作包来实现以Get的方式与后台交互,示例如下:

//封装用于请求的 方法 对象HttpGet get = new HttpGet("http://192.168.0.100:8080/test.jsp?uuid=uuid121&name=name222");//创建一个Http的客户端对象HttpClient client = new DefaultHttpClient();try{ //发送请求,并获得返回对象HttpResponse response = client.execute(get);//从response对象里面把返回值取出来HttpEntity entity = response.getEntity();//得到返回内容的流,接下来就是流式操作了InputStream in = entity.getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(in));StringBuffer buffer = new StringBuffer();String tempStr = "";while((tempStr=reader.readLine())!=null){buffer.append(tempStr);}in.close();//应该写finally里面去reader.close();//应该写finally里面去Log.i("javass",buffer.toString());}catch(Exception err){err.printStackTrace();}

使用Apache的Http操作包来实现以Post的方式与后台交互,示例如下:

//封装用于请求的 方法 对象HttpPost post = new HttpPost("http://192.168.0.100:8080/test.jsp");//为post组织参数NameValuePair uuid = new BasicNameValuePair("uuid","postUuid");NameValuePair name = new BasicNameValuePair("name","postname");List<NameValuePair> list = new ArrayList<NameValuePair>();list.add(uuid);list.add(name);//把这些参数封装到HttpEntity中HttpEntity reqEntity = null;reqEntity = new UrlEncodedFormEntity(list);//然后把HttpEntity设置到post对象里面去post.setEntity(reqEntity);//创建一个Http的客户端对象HttpClient client = new DefaultHttpClient();//发送请求,并获得返回对象HttpResponse response = client.execute(post);

后面获取response的Entity等的处理,跟get方式是完全一样的,这里就不去赘述了。 

操作JSON

在实际应用开发中,网络间传输的数据经常是JSON格式的,除非十分有必要,不会去使用XML。因此必须要掌握Android如何处理JSON数据,Android已经自带了JSON的处理包“org.json”。下面就来看看如何解析已经获取的数据,获取数据的过程就是前面讲的获取的网络返回值。 

返回单个对象的情况,示例如下:

JSONObject j = new JSONObject(jsonData);String uuid = j.getString(“uuid");

返回对象数组的情况,示例如下:

JSONArray ja = new JSONArray(jsonData);for(int i=0;i<ja.length();i++){JSONObject j = ja.getJSONObject(i);String retUuid = j.getString("uuid");String retName = j.getString("name");Log.i("javass","ret jsonsss uuid="+retUuid+",name="+retName);}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxpr_ybgg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值