美文网首页Android知识Android开发Android
Android网络操作之套接字简单封装

Android网络操作之套接字简单封装

作者: ZacharyWang | 来源:发表于2016-09-03 22:12 被阅读356次

    我的所有文章会在我的个人博客首发和更新,欢迎关注。
    虽然Android开发中多数情况下使用http与后台进行数据交互,但有时套接字是http不能替代的,与http有众多的的第三方库如okttp等不同,套接字并没有多少第三方库可供选择,通常都是根据实际业务自行封装,本文介绍如何在Android中封装套接字进行网络操作并更新UI。

    众所周知,网络操作这种耗时操作是要放在子线程中进行的,所以套接字封装后,数据在子线程中被发送,然后将接收到的数据放进Message通过Handler发送回主线程,在进行UI更新。

    • 下面以用户登录为例,将套接字封装为一个Thread类。

    编写套接字Thread类

    下面的代码首先发送登录指令,在收到服务端的握手信息后,然后发送在构造方法中获得的通过已定义的方法构造的xml数据,得到服务端的响应后,将响应结果通过Handler发送回主线程。

    LoginSocketClient.java

    
    package xyz.zhenhua.smartcom.net;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    import java.nio.Buffer;
    import xyz.zhenhua.smartcom.utils.Utils;
    import xyz.zhenhua.smartcom.xmlparse.ParseUser;
    
    
    /**
     * Created by zachary on 16/8/31.
     */
    
    public class LoginSocketClient extends Thread {
        private ParseUser parseUser = new ParseUser();
        private Handler handler;
        private String data;
        private String ip = Utils.ip;
        private int port = Utils.port;
        public LoginSocketClient(Handler handler,String username, String password){
            this.handler = handler;
            this.data = parseUser.PackUser(username,password);
        }
    
        public void run(){
            try{
                Socket socket = new Socket(ip,port);
                Log.i("LoginClient","获取连接中");
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                Log.i("LoginClient","获取输入输出流成功");
                bw.write("USER_LOGIN");
                Log.i("LoginClient","已发送:"+data);
                bw.flush();
                String result = new String();
                char []c = new char[100];
                int l = 0;
                while((l=br.read(c))!=-1){
                    result = new String(c,0,l);
                    Log.i("LoginClient","收到:"+result);
                    if(result.equals("Hello\0")){
                        bw.write(user);
                        bw.flush();
                        Log.i("LoginClient","已发送:"+user);
                    }else if(result.equals("Login_failed")){
                        Message message = new Message();
                        message.what = Utils.LOGIN_FAILE;
                        handler.sendMessage(message);
                    } else{
                        Message message = new Message();
                        message.what = Utils.LOGIN_SUCESS;
                        message.obj = result;
                        handler.sendMessage(message);
                    }
                }
                bw.close();
                br.close();
                socket.close();
            }catch (Exception e){
            }
        }
    }
    
    
    

    主线程中调用LoginSocketClient

    调用就更简单啦,一句话搞定,当然,要先实例化一个Handler来接收子线程中返回的信息来更新UI。

    //调用LoginSocketClient
    new LoginSocketClient(hanlder,username,password).start();
    

    相关文章

      网友评论

        本文标题:Android网络操作之套接字简单封装

        本文链接:https://www.haomeiwen.com/subject/vzqlettx.html