基于Socket的网络编程
Android的网络编程部分,基本上和Java的网络编程是一样的,基本上也分成两种,一种是基于Socket的,另外一种是基于Http协议的。
基于Socket的基本用法,跟Java里面的用法一样,简单回顾一下:
一:服务端
1:启动一个服务器端的socket:ServerSocket server = new ServerSocket(1234);
2:开始侦听请求:Socket client = server.accept();
3:取得输入和输出流:
4:然后就可以通过流来进行网络传输了
5:最好要记得关闭流和Server
java代码:
- 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
java代码:
- 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的服务端示例:
java代码:
- 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的客户端示例:
java代码:
- 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文件中添加权限:
java代码:
- <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里面进行网络的处理了,建议使用后台线程或者是干脆新建一个线程来运行,比如:
java代码:
- Thread t =new Thread(new Runnable() {
- public void run() {
- //上面的代码
- }
- });
- t.start();
HttpURLConnection使用Post的方式与后台交互,下载数据部分跟上一个示例是一样的,麻烦在于上传数据到服务器,需要进行设置和处理,如下:
java代码:
- URL u = new URL("http://192.168.0.100:8080/test.jsp");
- conn = (HttpURLConnection)u.openConnection();
- //因为这个是post请求,下面两个需要设置为true
- conn.setDoOutput(true);
- conn.setDoInput(true);
java代码:
- // 设置以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的方式与后台交互,示例如下:
java代码:
- //封装用于请求的 方法 对象
- 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的方式与后台交互,示例如下:
java代码:
- //封装用于请求的 方法 对象
- 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”。下面就来看看如何解析已经获取的数据,获取数据的过程就是前面讲的获取的网络返回值。
返回单个对象的情况,示例如下:
java代码:
- JSONObject j = new JSONObject(jsonData);
- String uuid = j.getString(“uuid");
返回对象数组的情况,示例如下:
java代码:
- 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);
- }
视频配套PPT,视频地址【
Android4开发入门经典独家视频课程】