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

我的所有文章会在我的个人博客首发和更新,欢迎关注。
虽然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网络操作之套接字简单封装)