前言
欢迎大家我分享和推荐好用的代码段~~
声明
欢迎转载,但请保留文章原始出处:
CSDN:
http://www.csdn.net
雨季o莫忧离:http://blog.csdn.net/luckkof

正文


在Android的网络通讯中,通常会使用Socket进行设备间数的数据通讯,使用Http来对网络数据进行请求。
1、Socket(套接字)

不管是有过Java开发经验还是.NET开发经验的同学都应该对Socket有或多或少的了解,常见的TCP或者UDP协议其实都是基于Socket来实现的。

Socket是用于描述网络上的一个设备中的一个进程或者应用程序的,Socket由IP地址和端口号两部分组成。IP地址用来定位设备,端口号用来定位应用程序或者进程,比如我们常见的运行在80端口上的HTTP协议。Socket的常见格式为:192.168.1.1:1234。

那么应用程序是如何通过Socket来与网络中的其他设备进行通讯的呢?通常情况下,Socket通信有两部分,一部分为监听的Server端,一部分为主动请求连接的Client端。Server端会一直监听Socket中的端口直到有请求为止,当Client端对该端口进行连接请求时,Server端就给予应答并返回一个Socket对象,以后在Server端与Client端的数据交换就可以使用这个Socket来进行操作了。
2、Android中使用Socket进行数据交换

ServerSocket
建立服务端(Server)时,需要使用ServerSocket对象,这个对象会自动对其构造函数中传入的端口号进行监听,并在收到连接请求后,使用ServerSocket.accept()方法返回一个连接的的Socket对象。这个方法并不需要我们像在.NET中那样使用Start方法,它会自动进行监听的。

Socket
不管建立客户端(Client)还是在进行其他数据交换方面的操作时,都需要使用Socket类。Socket类在进行初始化时需要出入Server端的IP地址和端口号,并返回连接到Server端的一个Socket对象,如果是连接失败,那么将返回异常。同ServerSocket,也是自动进行连接请求的。

,并返回连接到Server端的一个Socket对象,如果是连接失败,那么将返回异常。同ServerSocket,也是自动进行连接请求的。

通过上面两个步骤后,Server端和Client端就可以连接起来了,但是仅仅连接起来是没有任何作用的,数据交换才是我们的目的,这时候就需要用到IO流中的OutputStream类和InputStream类。
OutputStream——可写流
当应用程序需要对流进行数据写操作时,可以使用Socket.getOutputStream()方法返回的数据流进行操作。
InputStream——可读流
当应用程序要从流中取出数据时,可以使用Socket.getInputStream()方法返回的数据流进行操作。

View Code  package LiB.Demo;  import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket;  public class SocketHelper {     private static ServerSocket serverSocket = null;     private static Socket client = null;     private final static int port = 9048;     private static BufferedReader br= null;      private static BufferedWriter bw = null;          /**      * 创建一个SocketServer对象用来建立服务器      * @throws IOException */     public static void CreateServer() throws IOException     {         serverSocket = new ServerSocket(port,10);         System.out.println("start listening...");     }          /**      * 创建一个Socket对象用来连接SocketServer对象      * @param dstName Server对象的ip地址      * @return       * @throws IOException */     public static Socket CreateClient(String dstName) throws IOException     {         Socket socket = new Socket(dstName, port);         //Socket sockets = new Socket("192.168.8.12",port);         return socket;     }          /**      * 返回一个已经连接到服务器上的Socket对象      * @throws IOException */     public static void GetClinetSocket() throws IOException     {         client = serverSocket.accept();         System.out.println("get a connected client");     }          /**      * 向socket对象所获取的流中发送数据      * @param socket      * @param msg      * @throws IOException */     public static void SendMsg(Socket socket , String msg) throws IOException     {         bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));         bw.write(msg);         bw.flush();         bw.close();     }          /**      * 获取socket对象流中数据      * @param socket      * @param msg      * @return      * @throws IOException */     public static String ReceiveMsg(Socket socket, String msg) throws IOException     {         br = new BufferedReader(new InputStreamReader(socket.getInputStream()));         String receiveMsg = "Receive msg:"+ br.readLine();         br.close();         return receiveMsg;     }          /**      * 释放socket对象      * @throws IOException */     public static void Close() throws IOException     {         if(client != null)         {             client.close();         }         if(serverSocket != null)         {             serverSocket.close();         }     } }

3、HTTP通讯
在开始前先简单介绍下HTTP协议中的两种不同的请求方式——GET和POST。GET方式在进行数据请求时,会把数据附加到URL后面传递给服务器,比如常见的:http://XXX.XXX.XXX/XX.aspx?id=1,POST方式则是将请求的数据放到HTTP请求头中,作为请求头的一部分传入服务器。所以,在进行HTTP编程前,首先要明确究竟使用的哪种方式进行数据请求的。
在Android中,可以有两种方式可以用来进行Http编程:1、HttpURLConnection;2、HttpClient。
HttpURLConnection
HttpURLConnection是继承自URLConnection的一个抽象类,在HTTP编程时,来自HttpURLConnection的类是所有操作的基础,获取该对象的代码如下:

View Code      public HttpURLConnection urlconn= null;     private void Init() throws IOException     {         if (urlStr=="")         {             urlStr="http://www.baidu.com";         }         URL url = new URL(urlStr);         //打开一个URL所指向的Connection对象         urlconn = (HttpURLConnection)url.openConnection();     }

HttpURLConnection对网络资源的请求在默认情况下是使用GET方式的,所以当使用GET方式时,不需要我们做太多的工作:

View Code      public HttpURLConnection urlconn= null;     private void Init() throws IOException     {         if (urlStr=="")         {             urlStr="http://www.baidu.com";         }         URL url = new URL(urlStr);         //打开一个URL所指向的Connection对象         urlconn = (HttpURLConnection)url.openConnection();     }     /**      * Http中的get请求,在Url中带有请求的参数,请求的URL格式通常为:"http://XXX.XXXX.com/xx.aspx?param=value"      * 在android中默认的http请求为get方式      * @return      * @throws IOException */     public String HttpGetMethod() throws IOException     {         if(urlconn == null)         {             Init();         }         String result = StreamDeal(urlconn.getInputStream());         urlconn.disconnect();         return result;     }

当我们需要使用POST方式时,就需要使用setRequestMethod()来设置请求方式了。

View Code      /**      * Http中的post请求,不在Url中附加任何参数,这些参数都会通过cookie或者session等其他方式以键值对的形式key=value传送到服务器上,完成一次请求      * 请求的URL格式通常为:"http://XXX.XXXX.com/xx.aspx"      * @param param 请求的键名      * @param value 请求的数据值      * @throws IOException */     public String HttpPostMethod(String key,String value) throws IOException     {         if (urlconn==null)         {             Init();         }         //设置该URLConnection可读         urlconn.setDoInput(true);         //设置该URLConnection可写         urlconn.setDoOutput(true);         //使用POST方式来提交数据         urlconn.setRequestMethod("POST");         //不运行缓存         urlconn.setUseCaches(false);         //当使用POST方式进行数据请求时,我们可以手动执行connect动作,当然,这个动作其实在getOutputStream()方法中会默认执行的 //上面那些设置URLConnection属性的动作,一定要在connect动作执行前,因为一旦动作已经执行,熟悉设置就没有任何作用了         urlconn.connect();         //使用POST方式时,我们需要自己构造部分Http请求的内容,因此我们需要使用OutputStream来进行数据写如操作         OutputStreamWriter writer = new OutputStreamWriter(urlconn.getOutputStream());                  String urlQueryStr = key+"="+URLEncoder.encode(value, "Utf-8");         writer.write(urlQueryStr);                  writer.flush();         writer.close();         //获取返回的内容         String result = StreamDeal(urlconn.getInputStream());         return result;              }

HttpClient
这个类并不是来自Android的,而是来自org.apache.http。和HttpURLConnection相同,HttpClient也存在GET和POST两种方式。
HttpGet
在HttpClient中,我们可以非常轻松使用HttpGet对象来通过GET方式进行数据请求操作,当获得HttpGet对象后我们可以使用HttpClient的execute方法来向我们的服务器发送请求。在发送的GET请求被服务器相应后,会返回一个HttpResponse响应对象,利用这个响应的对象我们能够获得响应回来的状态码,如:200、400、401等等。

View Code      public String HttpGetMethod()     {         String result = "";         try         {         HttpGet httpRequest = new HttpGet(urlStr);         HttpClient httpClient = new DefaultHttpClient();         HttpResponse httpResponse = httpClient.execute(httpRequest);         if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK)         {             result = EntityUtils.toString(httpResponse.getEntity());         }         else         {             result = "null";         }         return result;         }         catch(Exception e)         {             return null;         }     }

HttpPost

当我们使用POST方式时,我们可以使用HttpPost类来进行操作。当获取了HttpPost对象后,我们就需要向这个请求体传入键值对,这个键值对我们可以使用NameValuePair对象来进行构造,然后再使用HttpRequest对象最终构造我们的请求体,最后使用HttpClient的execute方法来发送我们的请求,并在得到响应后返回一个HttpResponse对象。其他操作和我们在HttpGet对象中的操作一样。

View Code  public String HttpPostMethod(String key,String value)     {         String result = "";         try         {         // HttpPost连接对象         HttpPost httpRequest = new HttpPost(urlStr);         // 使用NameValuePair来保存要传递的Post参数         List<NameValuePair> params = new ArrayList<NameValuePair>();         // 添加要传递的参数         params.add(new BasicNameValuePair(key, value));         // 设置字符集         HttpEntity httpentity = new UrlEncodedFormEntity(params, "Utf-8");         // 请求httpRequest         httpRequest.setEntity(httpentity);         // 取得默认的HttpClient         HttpClient httpclient = new DefaultHttpClient();         // 取得HttpResponse         HttpResponse httpResponse = httpclient.execute(httpRequest);         // HttpStatus.SC_OK表示连接成功         if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {             // 取得返回的字符串             result = EntityUtils.toString(httpResponse.getEntity());             return result;          } else {              return "null";         }         }         catch(Exception e)         {             return null;         }     }



更多相关文章

  1. 蓝牙操作 Bluetooth
  2. android launcher总体分析 .
  3. Android_Intent意图详解
  4. Android之Volley框架加载网络图片的三种方式
  5. 解决Android9.0网络请求无效问题
  6. Android(安卓)Intent实现页面跳转
  7. Android经典底部选项卡集成方式之一
  8. 14天学会安卓开发(第十天)Android网络与通讯
  9. Android之传感器(一)

随机推荐

  1. css选择器与权重
  2. 伪类选择器与盒模型属性实例解析,附字体
  3. 伪类选择器、字体图标、盒模型属性、em和
  4. 12月22日作业 task1表格
  5. 注册表(原始的未加 css)
  6. 课程表(报名表)
  7. css样式 来源 规则 选择器权重
  8. Emmet语法
  9. css伪类选择器,字体图标,盒模型及自适应布
  10. Linux系统配置(系统优化)