Android--网络交互(Socket/Http)

来源:互联网 发布:喜马拉雅 兼职 知乎 编辑:程序博客网 时间:2024/06/18 10:10

第一种:socket(TCPUDP)

        1Socket:

             Socket又称”套接字"

             网络上的两个程序通过一个双向的通信链接实现数据的交换,这个连接的一端成为一个socket

             应用程序通常通过”套接字”向网络发出请求或者应答网络请

        2、网络通信的要素:

            网络上的请求就是通过socket来建立链接然后互相通信

            ip地址(网络上主机设备的唯一标识)

            端口号(定位程序)

            用于标示进程的逻辑地址,不同进程的标示( 有效端口:0~65535,其中0~1024由系统使用或者保留端口,开发中建议使用1024以上的端口)

            传输协议(通信的规则-->常见协议:TCP  UDP

        3TCPUDP

        TCP(传输控制协议)

                 建立链接,形成传输数据的通道

                 在链接中进行打暑假传输(数据不受到限制 )

                 通过三次握手完成链接,是可靠协议,安全送达

                 必须建立链接,效率会稍低

           UDP(用户数据报协议)

                 将数据及源和目的封装成数据包中,不需要建立链接

                 每个数据报的大小限制在64k之内

                 因为无需链接,因此是不可靠协议

                 不需要建立链接,速度快

        4、实例:

          <!--允许应用程序改变网络状态-->    

          <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>    

    

          <!--允许应用程序改变WIFI连接状态-->    

          <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>    

    

          <!--允许应用程序访问有关的网络信息-->    

          <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>    

    

          <!--允许应用程序访问WIFI网卡的网络信息-->    

          <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>    

    

          <!--允许应用程序完全使用网络-->    

          <uses-permission android:name="android.permission.INTERNET"/>   

   

        (1)、使用TCP协议通信

                     Socket socket;  

        try {

              // 创建一个Socket对象,并指定服务端的IP及端口号  

             socket = new Socket("192.168.1.32", 1989);  

             // 创建一个InputStream用户读取要发送的文件。  

             InputStream inputStream = new FileInputStream("e://a.txt");  

             // 获取SocketOutputStream对象用于发送数据。  

             OutputStream outputStream = socket.getOutputStream();  

             // 创建一个byte类型的buffer字节数组,用于存放读取的本地文件  

             byte buffer[] = new byte[4 * 1024];  

             int temp = 0;  

             // 循环读取文件  

             while ((temp = inputStream.read(buffer)) != -1) {  

                 // 把数据写入到OuputStream对象中  

                 outputStream.write(buffer, 0, temp);  

             }  

             // 发送读取的数据到服务端  

             outputStream.flush();  

  

            /** 

            或创建一个报文,使用BufferedWriter写入,看你的需求 

            String socketData = "[2143213;21343fjks;213]";  

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(  

                  socket.getOutputStream()));  

            writer.write(socketData.replace("\n", " ") + "\n");  

            writer.flush();  

            **/  

             } catch (UnknownHostException e) {  

             e.printStackTrace();  

             } catch (IOException e) {  

             e.printStackTrace();  

             }   

        

       (2)、使用UDP协议通信

             DatagramSocket socket;  

     try {  

         //实例化的端口号要和发送时的socket一致,否则收不到data  

          socket = new DatagramSocket(1985);  

          byte data[] = new byte[4 * 1024];  

          //参数一:要接受的data 参数二:data的长度  

    DatagramPacket packet = new DatagramPacket(data, data.length);  

          socket.receive(packet);  

          //把接收到的data转换为String字符串  

          String result = new String(packet.getData(), packet.getOffset(),  packet.getLength());  

         socket.close();//不使用了记得要关闭  

         System.out.println("the number of reveived Socket is  :" + flag  

                + "udpData:" + result);  

         } catch (SocketException e) {  

                e.printStackTrace();  

         } catch (IOException e) {  

            e.printStackTrace();  

         }  

第二种:http

1HttpURLConnection

           (1)、首先需要获取到HttpURLConnection(缩写:URL)的实例,一般只需new 出一个URL对象。

           (2)、调用一下openConnection()方法。

           (3)、得到了HttpURLConnection的实例之后,我们可以设置一下HTTP请求所使用的方法(POSTGET:由于Android SDK包含org.apache.http包,所以不用导入jar.

    get

          String serverURL = "http://127.0.0.1/xxx/xx.jsp?username=abc;

          HttpGet httpRequest = new HttpGet(serverURL);// 建立http get联机

          HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);// 发出http请求

          if (httpResponse.getStatusLine().getStatusCode() == 200)

          String result = EntityUtils.toString(httpResponse.getEntity());// 获取相应的字符串

   post

           String uriAPI = "http://127.0.0.1/xxx/xx.jsp";  //声明网址字符串

           HttpPost httpRequest = new HttpPost(uriAPI);   //建立HTTP POST联机

           List <NameValuePair> params = new ArrayList <NameValuePair>();   //Post运作传送变量必须用NameValuePair[] 数组储存 

           params.add(new BasicNameValuePair("str", "I am Post String"));   

           httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));   //发出http请求

           HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);   //取得http响应

           if(httpResponse.getStatusLine().getStatusCode() == 200)    

           String strResult = EntityUtils.toString(httpResponse.getEntity());   //获取字符串

   (4)、接下来就可以进行一些自由的定制了,比如设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头等。

   (5)、调用getInputStream()方法就可以获取到服务器返回的输入流了,剩下的任务就是对输入流进行读取。

            这是一个接收服务器信息的代码:(先把流inputstream到内存中,再reader出来)

            new Thread(new Runnable(){

 

            @Override

            public void run() {

                // TODO Auto-generated method stub

                HttpURLConnection connection=null;

                 

                try {

                    URL url=new URL("http://www.baidu.com");

                    connection =(HttpURLConnection) url.openConnection();

                    connection.setRequestMethod("GET");

                    connection.setConnectTimeout(8000);

                    connection.setReadTimeout(8000);

                    InputStream in=connection.getInputStream();

                    //下面对获取到的输入流进行读取

                    BufferedReader reader=new BufferedReader(new InputStreamReader(in));

                    StringBuilder response=new StringBuilder();

                    String line;

                    while((line=reader.readLine())!=null){

                        response.append(line);

                    }

                    Message message=new Message();

                    message.what=SHOW_RESPONSE;

                    //将服务器返回的结果存放到Message

                    message.obj=response.toString();

                    handler.sendMessage(message);

                     

                     

                } catch (MalformedURLException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }catch(Exception e){

                    e.printStackTrace();

                }finally{

                    if(connection!=null){

                        connection.disconnect();

                    }

                }

            }

             

        }).start();

   

2HttpClient

           (1)、首先我们要知道,HttpClient是一个接口,因此无法创建它的实例,通常情况下都会创建一个DefaultHttpClient的实例。

           (2)、如果想要发起一条GET请求,就可以创建一个HttpGet对象。

           (3)、调用HttpClientexecute()方法。执行execute()方法之后会返回一个HttpResponse对象,服务器所返回的所有信息就会包含在这里面。

           (4)、200就说明请求和响应都成功。

           (5)、这个if判断的内部取出服务返回的具体内容,可以调用getEntity()方法获取到一个HttpEntity实例,然后再用

                  EntityUtils.toString()这个静态方法将HttpEntity转化成字符串。

                  new Thread(new Runnable(){

 

            @Override

            public void run() {

                // TODO Auto-generated method stub

                try{

                    HttpClient httpClient=new DefaultHttpClient() ;

                    HttpGet httpGet=new HttpGet("http://www.baidu.com");

                    HttpResponse httpResponse=httpClient.execute(httpGet);

                    if(httpResponse.getStatusLine().getStatusCode()==200){

                        //请求和响应都成功了

                        HttpEntity entity=httpResponse.getEntity();

                        String response=EntityUtils.toString(entity,"utf-8");

                        Message message=new Message();

                        message.what=SHOW_RESPONSE;

                        //将服务器返回的结果存放到Message

                        message.obj=response.toString();

                        handler.sendMessage(message);

                    }

                }catch(Exception e){

                    e.printStackTrace();

                }

            }         

        }).start();

原创粉丝点击