zoukankan      html  css  js  c++  java
  • 安卓第七天笔记--网络编程一

    安卓第七天笔记--网络编程一

    Android对网络的支持

    Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,还可以使用DatagramSocket,Datagrampacket,MulticastSocket来建立 基于UDP的协议网络通信

    同时支持JDK提供的URL,URLConnection等网络通信API.

    Andoirdgip内置了Apache的HttpClient,这样可以非常方便的发送HTTP请求,并获取HTTP响应.

    1.Socket实现

    服务器

    package com.itheima.server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    
    /**
     * ServerSocket 服务端
    * @Decription TODO
     * @author 刘楠
     *
     * @time2016-2-22下午4:54:59
     */
    public class MyServer {
    
        public static ArrayList<Socket> socketList = new ArrayList<Socket>();
        public static void main(String[] args) {
        
            
            try {
                //建立serversocket
    
                ServerSocket serverSocket = new ServerSocket(25000);
                //服务器一直在运行状态
                while(true){
                    //开始监听
                    Socket socket = serverSocket.accept();
                    socketList.add(socket);
                    //启动新的线程
                    new ServerThread(socket).start();
                }
                
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    
    /*
    线程类
    */
    
    package com.itheima.server;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class ServerThread extends Thread {
        private Socket socket;
        
        public ServerThread(Socket socket) throws IOException {
            //初始化
            this.socket = socket;        
        }
    
        @Override
        public void run() {
            String ip = socket.getInetAddress().getHostAddress();
            System.out.println("ip:"+ip);
            BufferedReader br=null;
            OutputStream out = null;
            try {
                br = new BufferedReader(new InputStreamReader(socket.getInputStream(),
                        "UTF-8"));
                out = socket.getOutputStream();
                
                String content = null;
                while((content=br.readLine())!=null){
                    System.out.println("来自客户端:"+content);
                    //手动加上换行 符,不然没客户端收不到
                    out.write((content+"
    ").toUpperCase().getBytes("utf-8"));
                    
                    System.out.println("服务发出去了:");
                }        
                out.close();
                br.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }

     

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context="com.itheima.mutithreadclient.MainActivity">
    
        <!--接收用户输入的内容-->
        <EditText
            android:id="@+id/input"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入要发送的内容"/>
    
    
        <Button
            android:id="@+id/send"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="发送"/>
    
    <!--接收服务返回的内容-->
        <TextView
            android:id="@+id/show"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    子线程

    /**
     * 线程类
     * Created by  刘楠 on 2016-02-22 17:51.
     */
    public  class  ClientThread implements  Runnable{
        private static final String TAG = "ClientThread";
    
    
        private Socket s;
        // 定义向UI线程发送消息的Handler对象
        private Handler handler;
        // 定义接收UI线程的消息的Handler对象
        public Handler revHandler;
        // 该线程所处理的Socket所对应的输入流
        BufferedReader br = null;
        OutputStream os = null;
        public ClientThread(Handler handler)
        {
            this.handler = handler;
        }
        public void run()
        {
            try
            {
                s = new Socket("192.168.1.103", 25000);
                br = new BufferedReader(new InputStreamReader(
                        s.getInputStream()));
                os = s.getOutputStream();
                // 启动一条子线程来读取服务器响应的数据
                new Thread()
                {
                    @Override
                    public void run()
                    {
                        String content = null;
                        // 不断读取Socket输入流中的内容
                        try
                        {
                            while ((content = br.readLine()) != null)
                            {
                                // 每当读到来自服务器的数据之后,发送消息通知程序
                                // 界面显示该数据
                                Message msg = new Message();
                                msg.what = 0x123;
                                msg.obj = content;
                                handler.sendMessage(msg);
                                Log.i(TAG,"服务返回"+content);
                            }
                        }
                        catch (IOException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }.start();
                // 为当前线程初始化Looper
                Looper.prepare();
                // 创建revHandler对象
                revHandler = new Handler()
                {
                    @Override
                    public void handleMessage(Message msg)
                    {
                        // 接收到UI线程中用户输入的数据
                        if (msg.what == 0x345)
                        {
                            // 将用户在文本框内输入的内容写入网络
                            try
                            {
                                //手动加上换行符
                                os.write((msg.obj.toString() + "
    ")
                                        .getBytes("utf-8"));
                                Log.i(TAG, "输入的" + msg.obj.toString());
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                            }
                        }
                    }
                };
                // 启动Looper
                Looper.loop();
            }
            catch (SocketTimeoutException e1)
            {
                System.out.println("网络连接超时!!");
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
    }

    Activity

    /**
     *
     * 使用ServketSocket做服务通信
     *
     *
     * @author  刘楠
     */
    public class MainActivity extends AppCompatActivity {
    
        private EditText input;
    
        private TextView show;
    
        private ClientThread clientThread;
    
        private Button send;
    
        private Handler handler;
    
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            input = (EditText) findViewById(R.id.input);
    
            show = (TextView) findViewById(R.id.show);
    
            send = (Button) findViewById(R.id.send);
    
            /**
             * 接收到消息要就显示
             */
             handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
    
                    if(msg.what==0x123){
                        show.append("
    "+msg.obj.toString());
                    }
    
                }
            };
    
    
            //初始化子线程
            clientThread = new ClientThread(handler);
            //启动子线程
            new Thread(clientThread).start();
    
    
    
            send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String str = input.getText().toString().trim();
    
                    Message msg=new Message();
                    msg.what=0x345;
                    msg.obj=str;
    
                    //把内容发给子线程
                    clientThread.revHandler.sendMessage(msg);
    
                    //清空文本框
                    input.setText("");
                }
            });
        }
    
    
    
    
    }
     
    
    <!--添加网络权限-->
    <uses-permission android:name="android.permission.INTERNET"/>

    2.URL连接网络

    布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <EditText
            android:id="@+id/et_url"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入URL图片地址"/>
    
        <Button
            android:onClick="display"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="显示图片地址"/>
    
    
        <ImageView
            android:id="@+id/show"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

    Activity

    /**
     * URL连接网络
     * 获取URL地址
     * 打开流,获取流的内容
     * 
     */
    public class MainActivity extends AppCompatActivity {
    
        /*
        标识表示成功
         */
        private static final int SUCCESS = 1;
        //路径写死了 也可以获取的方式
        private String path ="http://img2.imgtn.bdimg.com/it/u=4114593003,3380074209&fm=21&gp=0.jpg";
        /*
        图片
         */
        Bitmap bitmap;
    
        /*
        显示图片
         */
        ImageView show;
    
        /*
        输入的URL
         */
        private EditText et_url;
    
        private Handler handler;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            et_url = (EditText) findViewById(R.id.et_url);
    
            show = (ImageView) findViewById(R.id.show);
    
    
            handler = new Handler(){
    
                @Override
                public void handleMessage(Message msg) {
    
                    switch(msg.what){
                        case SUCCESS:
                        show.setImageBitmap(bitmap);
                        break;
                    }
                }
            };
        }
    
    
        /**
         * 获取输入的地址并显示图片
         * @param v  当前对象
         */
        public void display(View v){
    
    
            String strPath = et_url.getText().toString().trim();
    
            if(TextUtils.isEmpty(strPath)){
    
                Toast.makeText(this,"输入的路径不能为空",Toast.LENGTH_SHORT).show();
                return ;
            }
    
            new Thread(new Runnable() {
                @Override
                public void run() {
    
    
                    try {
    
                        //获取URL
                        URL url = new URL(path);
                        //打开流获取资源
                        InputStream in = url.openStream();
    
                        //使用BitmapFactory转换为Bitmap
                        bitmap = BitmapFactory.decodeStream(in);
                        //获取消息
                        Message msg = Message.obtain();
                        msg.what=SUCCESS;
                        msg.obj=bitmap;
    
                        handler.sendMessage(msg);
                        //关闭
                       // in.close();
                        //把文件保存到本地
                        in =url.openStream();
    
                        OutputStream out = openFileOutput("test.png",MODE_PRIVATE);
    
                        byte [] buf = new byte [1024];
                        int len=0;
                        while((len=in.read(buf))!=-1){
                            out.write(buf,0,len);
                        }
                        out.close();
                        in.close();
    
    
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }).start();
    
        }
    }

    添加网络权限

        <!--添加网络权限-->
        <uses-permission android:name="android.permission.INTERNET"/>

    3.URLConnection连接网络

    使用URLConnection连接网络
    *Get方式只要 获取请求地址把请求参数拼接在URL地址后面"?username="+user+"&password="+password
    * openConnection
    * 设置请求头信息
    * connect()建立实际连接
    * 获取输入流conn.getInputStream
    * 读取输入流中的内容
    *
    * Post方式,
    * 请求地址
    * ,将参数单独拼接为一个字符串params="username="+user+"&password="+password
    * openConnection
    * 设置请求头信息
    * connect()建立实际连接
    * setDoOuput(true)
    * setDoInput(true)
    * 写出参数conn.getOutPutStream().write(params.getBytes());
    * 获取输入流conn.getInputStream
    * 读取输入流中的内容

    服务器Servlet

    /**
     * LoginServlet
    * @Decription 处理登录请求的Servlet
     * @author 刘楠
     *
     * @time2016-2-22下午9:40:48
     */
    @WebServlet(urlPatterns={"/login"})
    public class LoginServlet extends HttpServlet {
    
        @SuppressWarnings("deprecation")
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /*
             * 获取用户名与密码并转换为UTF-8
             */
            String user = request.getParameter("username");
            /*String encode = URLEncoder.encode(user,"iso8859-1");
            String decode = URLDecoder.decode(encode, "UTF-8");*/
            
            String username =new String(user.getBytes("iso8859-1"),"utf-8");
            System.out.println("用户名:"+username);
            
            String pwd=request.getParameter("password");
            
            String password = new String(pwd.getBytes("iso8859-1"), "UTF-8");
            System.out.println("密码:"+password);
            
            /*
             * 这里写死用户名与密码,
             * 正常是去数据库查询
             */
            PrintWriter writer = response.getWriter();
            
            if("admin".equals(username)&& "admin".equals(password)){
                writer.write("SUCCESS");
                
            }else{
                writer.write("FAILURE");
            }
            
            
            
            
                
            
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("================post===============");
            request.setCharacterEncoding("UTF-8");
            String username = request.getParameter("username");
            
            String password = request.getParameter("password");
            System.out.println("username:"+username+",password: "+password);
            
            if("admin".equals(username) && "admin".equals(password)){
                response.getWriter().print("SUCCESS");
            }else{
                response.getWriter().print("failure");
            }
        }
    
    }
    View Code

    3.1get请求与Post请求

     布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context="com.itheima.urlconnection.MainActivity">
    
        <EditText
            android:id="@+id/et_user"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入用户名"/>
        <EditText
            android:id="@+id/et_pwd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:hint="请输入密码"/>
    
    
        <Button
            android:onClick="get"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="GET请求"/>
        <Button
            android:onClick="post"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="POST  请求"/>
    
    
        <TextView
            android:id="@+id/show"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    Activity

    /**
     * 使用URLConnection连接网络
     *Get方式只要 获取请求地址把请求参数拼接在URL地址后面"?username="+user+"&password="+password
     * openConnection
     * 设置请求头信息
     * connect()建立实际连接
     * 获取输入流conn.getInputStream
     * 读取输入流中的内容
     *
     * Post方式,
     * 请求地址
     * ,将参数单独拼接为一个字符串params="username="+user+"&password="+password
     * openConnection
     * 设置请求头信息
     * connect()建立实际连接
     * setDoOuput(true)
     * setDoInput(true)
     * 写出参数conn.getOutPutStream().write(params.getBytes());
     * 获取输入流conn.getInputStream
     * 读取输入流中的内容
     *
     *
     */
    public class MainActivity extends AppCompatActivity {
    
        private static final int SUCCESS = 1;
        private static final int ERROR =2 ;
        private static final String TAG ="MainActivity" ;
        /*
            请求的路径
             */
        private String path="http://192.168.1.103:8080/Login/login";
    
        private TextView show;
    
        private EditText et_user;
    
        private EditText et_pwd;
    
    
        /*
        Handler 消息处理
         */
    
        private Handler handler;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            /*
            初始化
             */
            et_user = (EditText) findViewById(R.id.et_user);
            et_pwd = (EditText) findViewById(R.id.et_pwd);
    
            show = (TextView) findViewById(R.id.show);
    
            handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    switch (msg.what){
                        case SUCCESS:
                            show.setText(msg.obj.toString());
                            break;
                        case ERROR:
                            Toast.makeText(MainActivity.this,"网络异常",Toast.LENGTH_SHORT).show();
                            break;
                    }
                }
            };
        }
    
    
        /**
         * get 方式请求
         * @param v 当前组件
         */
        public void get(View v){
    
            String username = et_user.getText().toString().trim();
    
            String password = et_pwd.getText().toString().trim();
    
            if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
    
                Toast.makeText(this,"用户名或者密码不能为空",Toast.LENGTH_SHORT).show();
                return ;
            }
    
            final String urlName =path+"?username="+username+"&password="+password;
            /*
            get请求
             */
            new Thread(){
                @Override
                public void run() {
    
    
                    try {
                        //获取请求URL地址
                        URL url=new URL(urlName);
                        //打开连接
                        URLConnection conn = url.openConnection();
    
                        //设置超时时间
                        conn.setConnectTimeout(5000);
    
    
    
                        // 设置通用的请求属性
                        conn.setRequestProperty("accept", "*/*");
                        conn.setRequestProperty("connection", "Keep-Alive");
                        conn.setRequestProperty("user-agent",
                                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    
    
                        //建立实际连接
                        conn.connect();
                        //获取所有的行响应 头字段
    
                        Map<String,List<String>> map = conn.getHeaderFields();
    
    
                        Set<String> keySet = map.keySet();
                        for (String key:keySet ) {
                            Log.i(TAG,"key"+key+"------------>"+map.get(key));
                        }
    
                        //定义输入流来获取URL的响应
    
                        InputStream in = conn.getInputStream();
                        ByteArrayOutputStream bas= new ByteArrayOutputStream();
                                
                         int len=0;
                        
                        byte [] buf = new byte[1024];
                        
                        while((len=in.read(buf))!=-1){
                            bas.write(buf,0,len);
                        }
    
                        //转换为字符串
                        String result=bas.toString();
    
                        //设置消息对象
                        Message msg = Message.obtain();
                        //成功就发送SUCCESS
                        msg.what=SUCCESS;
                        msg.obj=result;
                        //发送
                        handler.sendMessage(msg);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                        //出异常就发送ERROR
                        Message msg = Message.obtain();
    
                        msg.what=ERROR;
                        handler.sendMessage(msg);
                    }
    
    
                }
            }.start();
    
        }
    
        /**
         * post 方式请求
         * @param v 当前组件
         */
        public void post(View v){
            String username = et_user.getText().toString().trim();
    
            String password = et_pwd.getText().toString().trim();
    
            if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
    
                Toast.makeText(this,"用户名或者密码不能为空",Toast.LENGTH_SHORT).show();
                return ;
            }
    
    
            final String params="username="+username+"&password="+password;
            /*
            post请求
             */
            new Thread(){
                @Override
                public void run() {
                    try {
                        //获取请求URL地址
                        URL url=new URL(path);
                        //打开连接
                        URLConnection conn = url.openConnection();
    
                        //设置超时时间
                        conn.setConnectTimeout(5000);
    
    
    
                        // 设置通用的请求属性
                        conn.setRequestProperty("accept", "*/*");
                        conn.setRequestProperty("connection", "Keep-Alive");
                        conn.setRequestProperty("user-agent",
                                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    
                        /*
                        post请求必须有以下2行
                         */
                        conn.setDoOutput(true);
                        conn.setDoInput(true);
    
                        OutputStream out = conn.getOutputStream();
    
                        out.write(params.getBytes());
    
    
    
                        //建立实际连接
    
                        //获取所有的行响应 头字段
    
                        Map<String,List<String>> map = conn.getHeaderFields();
    
    
                        Set<String> keySet = map.keySet();
                        for (String key:keySet ) {
                            Log.i(TAG,"key"+key+"------------>"+map.get(key));
                        }
    
                        //定义输入流来获取URL的响应
    
                        InputStream in = conn.getInputStream();
                        ByteArrayOutputStream bas= new ByteArrayOutputStream();
    
                        int len=0;
    
                        byte [] buf = new byte[1024];
    
                        while((len=in.read(buf))!=-1){
                            bas.write(buf,0,len);
                        }
    
                        //转换为字符串
                        String result=bas.toString();
    
                        //设置消息对象
                        Message msg = Message.obtain();
                        //成功就发送SUCCESS
                        msg.what=SUCCESS;
                        msg.obj=result;
                        //发送
                        handler.sendMessage(msg);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                        //出异常就发送ERROR
                        Message msg = Message.obtain();
    
                        msg.what=ERROR;
                        handler.sendMessage(msg);
                    }
    
    
                }
            }.start();
    
        }
    }
    View Code

    添加网络权限

        <!--添加网络权限-->
        <uses-permission android:name="android.permission.INTERNET"/>

    4.Http网络连接

     

    和URLConnection非常类似只获取连接为HttpURULConnection

    /**
    * 使用HttpURLConnection连接网络
    *Get方式只要 获取请求地址把请求参数拼接在URL地址后面"?username="+user+"&password="+password
    * openConnection
    * 设置请求方法setRequestMethod("GET")必须大写
    *
    * 获取输入流conn.getInputStream
    * 读取输入流中的内容
    *
    * Post方式,
    * 请求地址
    * ,将参数单独拼接为一个字符串params="username="+user+"&password="+password
    * openConnection
    * 设置请求方法setRequestMethod("POST")必须大写
    * setDoOuput(true)
    * setDoInput(true)
    * 写出参数conn.getOutPutStream().write(params.getBytes());
    * 获取输入流conn.getInputStream
    * 读取输入流中的内容
    *
    *
    */
    /**
     * 使用HttpURLConnection连接网络
     *Get方式只要 获取请求地址把请求参数拼接在URL地址后面"?username="+user+"&password="+password
     * openConnection
     * 设置请求方法setRequestMethod("GET")必须大写
     *
     * 获取输入流conn.getInputStream
     * 读取输入流中的内容
     *
     * Post方式,
     * 请求地址
     * ,将参数单独拼接为一个字符串params="username="+user+"&password="+password
     * openConnection
     * 设置请求方法setRequestMethod("POST")必须大写
     * setDoOuput(true)
     * setDoInput(true)
     * 写出参数conn.getOutPutStream().write(params.getBytes());
     * 获取输入流conn.getInputStream
     * 读取输入流中的内容
     *
     *
     */
    public class MainActivity extends  AppCompatActivity{
    private static final int SUCCESS = 1;
    private static final int ERROR =2 ;
    private static final String TAG ="MainActivity" ;
        /*
            请求的路径
             */
    private String path="http://192.168.1.100:8080/Login/login";
    
    private TextView show;
    
    private EditText et_user;
    
    private EditText et_pwd;
    
    
        /*
        Handler 消息处理
         */
    
    private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            /*
            初始化
             */
            et_user = (EditText) findViewById(R.id.et_user);
            et_pwd = (EditText) findViewById(R.id.et_pwd);
    
            show = (TextView) findViewById(R.id.show);
    
            handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
            switch (msg.what){
            case SUCCESS:
            show.setText(msg.obj.toString());
            break;
            case ERROR:
            Toast.makeText(MainActivity.this, "网络异常", Toast.LENGTH_SHORT).show();
            break;
            }
            }
            };
            }
    
    
    /**
     * get 方式请求
     * @param v 当前组件
     */
    public void get(View v){
    
            String username = et_user.getText().toString().trim();
    
            String password = et_pwd.getText().toString().trim();
    
            if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
    
            Toast.makeText(this,"用户名或者密码不能为空",Toast.LENGTH_SHORT).show();
            return ;
            }
    
    final String urlName =path+"?username="+username+"&password="+password;
            /*
            get请求
             */
            new Thread(){
    @Override
    public void run() {
    
    
            try {
            //获取请求URL地址
            URL url=new URL(urlName);
            //打开连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
            //设置超时时间
            conn.setConnectTimeout(5000);
            //设置请求方式
            conn.setRequestMethod("GET");
            //获取响应码
            int code = conn.getResponseCode();
    
            if(code==200) {
                    //获取所有的行响应 头字段
    
                    Map<String, List<String>> map = conn.getHeaderFields();
    
    
                    Set<String> keySet = map.keySet();
                    for (String key : keySet) {
                            Log.i(TAG, "key" + key + "------------>" + map.get(key));
                    }
    
                    //定义输入流来获取URL的响应
    
                    InputStream in = conn.getInputStream();
                    ByteArrayOutputStream bas = new ByteArrayOutputStream();
    
                    int len = 0;
    
                    byte[] buf = new byte[1024];
    
                    while ((len = in.read(buf)) != -1) {
                            bas.write(buf, 0, len);
                    }
    
                    //转换为字符串
                    String result = bas.toString();
    
                    //设置消息对象
                    Message msg = Message.obtain();
                    //成功就发送SUCCESS
                    msg.what = SUCCESS;
                    msg.obj = result;
                    //发送
                    handler.sendMessage(msg);
            }else{
                    //出异常就发送ERROR
                    Message msg = Message.obtain();
    
                    msg.what=ERROR;
                    handler.sendMessage(msg);
            }
    
    
    
            } catch (Exception e) {
            e.printStackTrace();
            //出异常就发送ERROR
            Message msg = Message.obtain();
    
            msg.what=ERROR;
            handler.sendMessage(msg);
            }
    
    
            }
            }.start();
    
            }
    
    /**
     * post 方式请求
     * @param v 当前组件
     */
    public void post(View v){
            String username = et_user.getText().toString().trim();
    
            String password = et_pwd.getText().toString().trim();
    
            if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){
    
            Toast.makeText(this,"用户名或者密码不能为空",Toast.LENGTH_SHORT).show();
            return ;
            }
    
    
    final String params="username="+username+"&password="+password;
            /*
            post请求
             */
            new Thread(){
    @Override
    public void run() {
            try {
            //获取请求URL地址
            URL url=new URL(path);
            //打开连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
            //设置超时时间
            conn.setConnectTimeout(5000);
             //设置请求方式
             conn.setRequestMethod("POST");
              /*
              post请求必须有以下2行
             */
            conn.setDoOutput(true);
    
    
            OutputStream out = conn.getOutputStream();
    
            out.write(params.getBytes());
    
    
    
            //建立实际连接
    
            //获取所有的行响应 头字段
    
            Map<String,List<String>> map = conn.getHeaderFields();
    
    
            Set<String> keySet = map.keySet();
            for (String key:keySet ) {
            Log.i(TAG,"key"+key+"------------>"+map.get(key));
            }
    
            //定义输入流来获取URL的响应
    
            InputStream in = conn.getInputStream();
            ByteArrayOutputStream bas= new ByteArrayOutputStream();
    
            int len=0;
    
            byte [] buf = new byte[1024];
    
            while((len=in.read(buf))!=-1){
            bas.write(buf,0,len);
            }
    
            //转换为字符串
            String result=bas.toString();
    
            //设置消息对象
            Message msg = Message.obtain();
            //成功就发送SUCCESS
            msg.what=SUCCESS;
            msg.obj=result;
            //发送
            handler.sendMessage(msg);
    
            } catch (Exception e) {
            e.printStackTrace();
            //出异常就发送ERROR
            Message msg = Message.obtain();
    
            msg.what=ERROR;
            handler.sendMessage(msg);
            }
    
    
            }
            }.start();
    
            }
            }
    View Code

    5.使用ApacheHttpClient

    /**
     * 使用HttpClient做网络请求 5.0过期,6.0不可用
     * 
     * 建立HttpClient对象 get请求 建立httpGet对象
     * setParams来设置参数
     * 也可以将参数拼接在URL地址后面
     * 
     * post请求 建立HttpPost对象
     * 设置请求体
     * setEntity
     * new UrlEncodedFormEntity(List<? extends NameValuePair>)
     * 设置参数
     * 
     * 获取行响应码,判断,
     * 获取行响应体
     * 
     * 
     * 
     * @author 刘楠
     * 
     *         2016-2-23上午12:04:06
     */
    public class MainActivity extends Activity {
    
        private static final int SUCCESS = 1;
        private static final int ERROR = 2;
        private static final String TAG = "MainActivity";
        /*
         * 请求的路径
         */
        private String path = "http://192.168.1.100:8080/Login/login";
    
        private TextView show;
    
        private EditText et_user;
    
        private EditText et_pwd;
    
        private HttpClient client;
    
        /*
         * Handler 消息处理
         */
    
        private Handler handler;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            /*
             * 初始化
             */
            client = new DefaultHttpClient();
    
            et_user = (EditText) findViewById(R.id.et_user);
            et_pwd = (EditText) findViewById(R.id.et_pwd);
    
            show = (TextView) findViewById(R.id.show);
    
            handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    switch (msg.what) {
                    case SUCCESS:
                        show.setText(msg.obj.toString());
                        break;
                    case ERROR:
                        Toast.makeText(MainActivity.this, "网络异常",
                                Toast.LENGTH_SHORT).show();
                        break;
                    }
                }
            };
        }
    
        /**
         * get 方式请求
         * 
         * @param v
         *            当前组件
         */
        
        private String urlName ;
        public void get(View v) {
    
            String username = et_user.getText().toString().trim();
    
            String password = et_pwd.getText().toString().trim();
    
            if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
    
                Toast.makeText(this, "用户名或者密码不能为空", Toast.LENGTH_SHORT).show();
                return;
            }
            
            try {
                 urlName =  path + "?username="
                        + URLEncoder.encode(username, "UTF-8") + "&password="
                        + URLEncoder.encode(password, "UTF-8");
            } catch (UnsupportedEncodingException e1) {
                
                e1.printStackTrace();
            }
    
            /*
             * get请求
             */
            new Thread() {
                @Override
                public void run() {
                    try {
                        HttpGet get = new HttpGet(urlName);
                        /**
                         * 可以使用HttpParams设置参数 HttpParams params = new
                         * BasicHttpParams();
                         */
                        // 开始执行
                        HttpResponse response = client.execute(get);
                        // 获取响应码
                        int code = response.getStatusLine().getStatusCode();
    
                        if (code == 200) {
                            // 获取内容响应体中的内容
                            InputStream in = response.getEntity().getContent();
    
                            ByteArrayOutputStream bas = new ByteArrayOutputStream();
    
                            int len = 0;
                            byte[] buf = new byte[1024];
    
                            while ((len = in.read(buf)) != -1) {
                                bas.write(buf, 0, len);
                            }
                            String result = bas.toString();
                            in.close();
                            //设置消息
                            Message msg = Message.obtain();
    
                            msg.what = SUCCESS;
                            msg.obj = result;
                            handler.sendMessage(msg);
    
                        } else {
                            Message msg = Message.obtain();
    
                            msg.what = SUCCESS;
    
                            handler.sendMessage(msg);
    
                        }
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                }
    
            }.start();
            
    
        }
    
        /**
         * post 方式请求
         * 
         * @param v
         *            当前组件
         * @throws UnsupportedEncodingException
         */
        public void post(View v) {
            final String username = et_user.getText().toString().trim();
    
            final String password = et_pwd.getText().toString().trim();
    
            if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
    
                Toast.makeText(this, "用户名或者密码不能为空", Toast.LENGTH_SHORT).show();
                return;
            }
            /*
             * post请求
             */
            new Thread() {
                @Override
                public void run() {
                    try {
                        //建立Post请求
                        HttpPost post = new HttpPost(path);
                        
                        List<NameValuePair> parameters = new ArrayList<NameValuePair>();
                        
                        
                        parameters.add(new BasicNameValuePair("username", username));
                        parameters.add(new BasicNameValuePair("password", password));
                        //设置请求体与字符编码
                        post.setEntity(new UrlEncodedFormEntity(parameters,"UTF-8") );
                        
                        //执行
                        HttpResponse response = client.execute(post);
                        //获取响应码
                        int code = response.getStatusLine().getStatusCode();
                        
                        if (code == 200) {
                            // 获取内容响应体中的内容
                            InputStream in = response.getEntity().getContent();
    
                            ByteArrayOutputStream bas = new ByteArrayOutputStream();
    
                            int len = 0;
                            byte[] buf = new byte[1024];
    
                            while ((len = in.read(buf)) != -1) {
                                bas.write(buf, 0, len);
                            }
                            String result = bas.toString();
                            in.close();
                            //设置消息
                            Message msg = Message.obtain();
    
                            msg.what = SUCCESS;
                            msg.obj = result;
                            handler.sendMessage(msg);
    
                        } else {
                            Message msg = Message.obtain();
    
                            msg.what = SUCCESS;
    
                            handler.sendMessage(msg);
    
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                }
    
            }.start();
    
        }
    
    }
    View Code

    6.WebView

    goBack():后退

    goForward():前进

    loadUrl(String url):加载指定URL的网页

    boolean zoomln():放大网页

    zoomOut():缩小网页

     

    布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <EditText
            android:id="@+id/et_url"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入url网址"/>
    
    
        <WebView
            android:id="@+id/wv_show"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
    
        </WebView>
    </LinearLayout>
    布局

    Activity

    /**
     * WebView小型浏览器
     *
     */
    public class MainActivity extends AppCompatActivity {
    
        /*
        接收输入的URL
         */
        private EditText et_url;
    
        /*
        显示网页内容
         */
        private WebView wv_show;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            et_url = (EditText) findViewById(R.id.et_url);
    
            wv_show = (WebView) findViewById(R.id.wv_show);
    
        }
    
    
        @Override
        public boolean onKeyDown(int keyCode,KeyEvent event) {
    
            if(keyCode==KeyEvent.KEYCODE_MENU){
    
                String urlStr = et_url.getText().toString().trim();
                //加载
                wv_show.loadUrl(urlStr);
    
                return  true;
            }
    
            return false;
        }
    
    }

    添加权限

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

    7.使用WebHTML加载HTML代码

     

    WebView提供了一具

     

    loadData(String data,String mimeType ,String encoding)方法用于加载HTML,这个方法加载中文时会有乱码

     

    还有一个

     

    loadDataWithURL(String data,String mimeType ,String encoding,String historyUrl)方法是第一个方法的加强,

     

    data:指定的HTML代码

     

    mimeType:指定HTML代码的MIME类型,对象HTML代码可指定为text/html

     

    encoding:指定HTML代码编码所有的字符集:UTF-8

     

     

    布局中只有一个WebView

     

    
    
    /**
    
     * WebView显示HTML
    
     */
    
    public class MainActivity extends AppCompatActivity {
    
    
    
        private WebView webView_show;
    
    
    
        @Override
    
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
    
            //获取webView组件
    
            webView_show = (WebView) findViewById(R.id.webView_show);
    
    
    
            StringBuilder sb = new StringBuilder();
    
    
    
            sb.append("<html>");
    
    
    
            sb.append("<head>");
    
            sb.append("<title> 欢迎WebView显示HTML</title>");
    
            sb.append("</head>");
    
    
    
            sb.append("<body>");
    
            sb.append("<h1 align='center' style='color:red'>显示中文标题</h1>");
    
    
    
            sb.append("</body>");
    
    
    
            sb.append("</html>");
    
    
    
            //加载并显示HTML这个中文会显示乱码
    
            //webView_show.loadData(sb.toString(),"text/html","utf-8");
    
    
    
            webView_show.loadDataWithBaseURL(null,sb.toString(),"text/html","utf-8",null);
    
    
    
        }
    
    }

     

     

    9.WebView使用JavaScript调用Android

     

    • 步骤:
    •  

    • 1.调用WebView的get getSettings方法获取WebSettings
    • 2.启用JAVAScript调用功能
    • webSettings.setJavaScriptEnable(true)
    • 3.调用webView的addJavaScript(Object obj,String name)方法
    • 4.在javaScript脚本中通过刚才暴露的name对象调用Android
    • 5.对象的方法上必须加上注解
    • /**
      •  * 这具注解只能用在方法
        •  */
          • @JavascriptInterface
     

     

     

     

     

    Html在assets目录下

     

    <!DOCTYPE html>
    
    <html>
    
    <head>
    
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    
        <title>JS 调用</title>
    
    </head>
    
    
    
    <body>
    
    <!-- 注意此处的myObj是Android暴露出来的对象 -->
    
    <input type="button" value="弹Toast"
    
           onclick="person.show();"/>
    
    <input type="button" value="图书列表"
    
           onclick="person.showList();"/>
    
    </body>
    
    </html>

     

     

    布局

     

    <?xml version="1.0" encoding="utf-8"?>
    
    <RelativeLayout
    
        xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:layout_width="match_parent"
    
        android:layout_height="match_parent">
    
    
    
        <WebView
    
            android:id="@+id/webView"
    
            android:layout_width="match_parent"
    
            android:layout_height="match_parent"/>
    
    </RelativeLayout>

     

     

    JAVABean:

     

    /**
    
     * Created by  刘楠 on 2016-02-23 09:00.
    
     */
    
    
    
    public class Person {
    
    
    
    
    
        private String name;
    
    
    
        private int age;
    
    
    
        private Context mContext;
    
    
    
        public Person(Context context){
    
    
    
            this.mContext = context;
    
        }
    
    
    
    
    
    
    
        public Person(String name, int age) {
    
            this.name = name;
    
            this.age = age;
    
        }
    
    
    
        public String getName() {
    
            return name;
    
        }
    
    
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
    
    
        public int getAge() {
    
            return age;
    
        }
    
    
    
        public void setAge(int age) {
    
            this.age = age;
    
        }
    
    
    
        @JavascriptInterface
    
        public void show(){
    
            Toast.makeText(mContext,"姓名"+this.name+",年龄:"+age,Toast.LENGTH_SHORT).show();
    
        }
    
    
    
    
    
        /**
    
         * 这具注解只能用在方法
    
         */
    
        @JavascriptInterface
    
        public void showList(){
    
    
    
            new AlertDialog.Builder(mContext)
    
           //设置标题
    
            .setTitle("人员列表")
    
           .setIcon(R.mipmap.ic_launcher)
    
           .setItems(new String [] {"JAVA","Android","C++","C","PYTHON"},null)
    
                    .setPositiveButton("确定",null)
    
                    .setNegativeButton("取消",null)
    
                    .create().show();
    
    
    
    
    
    
    
    
    
        }
    
    }

     

     

    Activity

     

    /**
    
     * WebView使用JavaScript
    
     * 
    
     */
    
    public class MainActivity extends AppCompatActivity {
    
    
    
        private WebView webView;
    
    
    
    
    
    
    
        @Override
    
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
    
            webView = (WebView) findViewById(R.id.webView);
    
            webView.loadUrl("file:///android_asset/test.html");
    
    
    
            //获取WebView设置对象
    
            WebSettings webSettings = webView.getSettings();
    
    
    
            //启用javaScript
    
            webSettings.setJavaScriptEnabled(true);
    
    
    
            Person person = new Person(this);
    
    
    
            person.setName("张三");
    
            person.setAge(18);
    
    
    
            //传递对象
    
            webView.addJavascriptInterface(person, "person");
    
        }
    
    }
    
     

     

  • 相关阅读:
    gym 101480 Problem C: Cow Confinement 题解
    Uva 1072 Huffman Codes 题解
    NERC 2015 Hypercube 题解
    ACM ICPC 2017 WF Problem J Son of Pipe Stream题解
    CF Round # 295 (Div. 1)题解
    CF 1444 D Rectangular Polyline 题解
    BZOJ3308 九月的咖啡店
    BZOJ4025 二分图
    BZOJ4000 [TJOI2015]棋盘
    BZOJ3999 [TJOI2015]旅游
  • 原文地址:https://www.cnblogs.com/liunanjava/p/5207890.html
Copyright © 2011-2022 走看看