• Android网络通信的六种方式


    在Android中几种网络编程的方式:
    (1)针对TCP/IP的Socket、ServerSocket
    (2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是,考虑到Android设备通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有一点与普通互联网应用有所差异的。
    (3)针对直接URL的HttpURLConnection
    (4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。针对HTTP,Google集成了Appache Http core和httpclient 4版本,因此特别注意Android不支持httpclient 3.x系列,而且目前并不支持Multipart(MIME),需要自行添加httpmime.jar
    (5)使用Web Service。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice
      (6) 直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。

    一、我们先来看第一种,针对TCP/IP Socket、ServerSocket的形式。
    TCP/IP是一种协议,是一种面向连接的、可靠的协议。Socket仅仅是对TCP、UDP网络接口的封装,不涉及上层协议。TCP、UDP传输特性不同,分别适用于不同类型的应用层协议,其中TCP有连接,延时较长,能保证服务质量;UDP无连接,需要应用程序进行数据分包、延时短,效率高,数据包可能丢失或到达对端发生顺序混乱。在Socket之上可以实现这些RFC标准的应用层协议,也可以自定义实现私有的应用层协议。
    在JAVA编程中, 经常使用java.net和javax.net包来开发socket程序,下面列出所有常用的类,并简单介绍。关于详细的信息请参看JAVA文档。

    二、针对UDP的DatagramSocket、DatagramPackage

    1.对于UDP服务端,首先启动侦听服务,然后得到数据包进行处理,组后根据获得数据包进行反馈。

    2.UDP socket没有连接的概念,因此构造完成的DatagramSocket不会发出向对端的网络连接请求,在每一个发送的UDP数据包中包含目的地址和端口。因为UDP数据不会在对端进行重新组包,因此一次发送的数据长度必须加以限制。

    Socket.send(outputPacket);用于发送一个数据包;socket.receive(inputPacket);用于接收一个数据包。

    示例代码: 服务器端:

    public class UDPServer{             

      public static void main(String[] args) throws Exception{                     

        DatagramSocket udpSocket = new DatagramSocket(8000);                     

        while(true){

                                 try{                                      // UDP数据读取

                                         DatagramPacket packet = new DatagramPacket(new byte[512],512);

                                         udpSocket.receive(packet);

                                         String msg = new String(packet.getData()), 0,packet.getLength());

                                         System.out.println(msg);

                                         if(msg.equals("exit")){

                                                 break;

                                         }                                                                           // UDP数据发送

                                         SimpleDateFormat f = new SimpleDateFormat("MMM dd,yyyy kk:mm:ss");

                                         String time = "现在的时间是:" + f.format(new Date());

                                         packet.setData(time.getBytes());

                                         udpSocket.send(packet);

                                    }catch(Exception e){

                                         e.printStackTrace();

                                 }

                         }                

          udpSocket.close();

                 }

         }
    客户端: public void client(){

                 InetAddress remoteIP;

                    try {

                            remoteIP = InetAddress.getByName("localhost");

                            DatagramSocket socket = new DatagramSocket();

                    } catch (UnknownHostException e1) {

                            e1.printStackTrace();

                    }

                              BufferedReader wt = new BufferedReader (new InputStreamReader(System.in));

                 System.out.println("input one line ,user \"exit\" to quit the server ");

                 while(true){

                         try{                              // 读取输入

                                 String str = wt.readLine();

                                 byte[] outputData = str.getBytes();                              // UDP socket 数据发送

                                 DatagramPacket outputPacket = new DatagramPacket(outputData,outputData.length,remoteIP,8000);

                                 socket.send(outputPacket);

                                 if(str.equals("exit")){                                      //udp 数据读取

                                         DatagramPacket inputPacket = new DatagramPacket(new byte[512],512);

                                         socket.receive(inputPacket);

                                         System.out.println(new String(inputPacket.getData(),0,inputPacket.getLength()));

                                                                       }

                         }catch(Exception e){

                                 e.printStackTrace();

                         }

                 }

                 socket.close();

         }

    三、针对直接URL的HttpURLConnection
    这个就是把请求的方式从HttpClient换成HttpURLConnection就可以了。

    四、Google集成了Apache HTTP客户端,可使用HTTP进行网络编程
    这个不多说了,网络编程,必须会的。自己看代码吧。服务端我使用三种方式:S2SH、只用Struts2、Servlet。客户端就一种,只不过换个请求的URL。服务端和客户端交互使用了两种方式:XML、JSON,目前开放平台返回的数据都是支持这两种数据格式的。所以我也实现了这两种数据格式。其实还有一种格式,就是google的protocal buffer,这种形式在国内用的人比较少

     

    /** 检查网络状态 */ 

    • Context context = listActivity.getApplicationContext();//获取应用上下文 
    • ConnectivityManager connectivityManager = (ConnectivityManager) context 
    • .getSystemService(Context.CONNECTIVITY_SERVICE);//获取系统的连接服务 
    • NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();//获取网络的连接情况 
    • if(activeNetInfo.getType()==ConnectivityManager.TYPE_WIFI){ 
    • //判断WIFI网 
    • }elseif(activeNetInfo.getType()==ConnectivityManager.TYPE_MOBILE) { 
    • //判断3G网 

      private boolean checkNetworkState() {

      ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);

      if (connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected() // wifi     

        || connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected()) { // gprs

       return true;

      }

      return false;

     }

  • 相关阅读:
    35.使用拦截器实现权限验证
    34.TokenInterceptor防止表单重复提交
    33.使用默认的execAndWait拦截器
    32.使用来MethodFilterInterceptor灵活拦截
    31.自定义拦截器
    sql 学习笔记 档
    AVR文章7课时:动态数字化控制
    MapReduce 规划 系列的12 使用Hadoop Streaming技术集成newLISP文字
    左右TS分析流
    Java达到MySQL数据库备份(两)
  • 原文地址:https://www.cnblogs.com/lyz459/p/3065092.html
Copyright © 2020-2023  润新知