Andorid 简单的socket 模板

本文详细介绍了Socket通信的基本原理,包括Server端与Client端的实现方式。Server端通过创建ServerSocket监听特定端口,接收Client连接请求并进行数据交换。Client端则主动发起连接,并通过Socket发送数据。文章还展示了如何利用Handler机制在Activity与Socket间建立通信,确保数据的实时更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Server 端:

1 通过handler 与activity 通信。

2 启动一个thread, 等待client 连接和接收数据。

public class SocketServer implements Runnable{
    private static final String TAG = "SocketServer";

    private Context mContext;
    private boolean mStop = false;
    private Handler mHandler;
    ServerSocket mServerSocket;

    //handler  是activity 主线程的,用于socket 收到数据后用handler message通知activity
    public SocketServer(Context context, Handler handler){
        mContext = context;
        mHandler = handler;

        try{
            mServerSocket = new ServerSocket(8001);
            //启动一个thread 去等待客户端连接, 和接收数据
            //更据需要也可以等客户端连接后,也可以启动一个thread去发送数据
            Thread th = new Thread(this);
            th.start();
        }catch (IOException e){
            Log.i(TAG, "IOException e="+e);
        }

    }

    @Override
    public void run() {
        byte[] bytes = new byte[100];
        try{
            while (!mStop) {
                //等待客户端连接
                Socket socket = mServerSocket.accept();
                Log.i(TAG, "socket accept");

                DataInputStream inputStream = new DataInputStream(socket.getInputStream());
                while (!mStop) {
                    //while 循环, 不停接收数据
                    int len = inputStream.read(bytes);
                    if (len == -1) {
                        //客户端已断开, 跳出这层循环,重新等待客户端
                        Log.i(TAG, "socket disconnected");
                        break;
                    }
                    String str = new String(bytes);
                    Log.i(TAG, "read str=" + str + "; len = " + len);
                    Message msg = mHandler.obtainMessage(MainActivity.MESSAGE_SOCKET_UPDATE);

                    //通过handler, 通知数据到activity
                    Bundle data = new Bundle();
                    data.putString("data", str);
                    msg.setData(data);
                    mHandler.sendMessage(msg);
                }
            }
            mServerSocket.close();
            mServerSocket = null;
            Log.i(TAG,"serverSocket.close");

        }catch (IOException e){
            Log.i(TAG, "IOException e="+e);
        }

    }

    //activity 退出, 关闭socket server
    public void destroy(){
        Log.i(TAG,"destroy");
        mStop = true;
        if(mServerSocket != null){
            try {
                mServerSocket.close();
                Log.i(TAG,"serverSocket.close");
            }catch (IOException e){
                Log.i(TAG, "IOException e="+e);
            }
        }
    }
}

Client 端:

1 activity 会传handler进来, 用于和activity的通信

2 启动一个thread去连接server, 和发送数据。 当连接到server后,thread 会启动Looper 来等待activity的发送数据

 
                Looper.prepare();
                mHandleThread = new Handler(){
                    @Override
                    public void handleMessage(Message msg) {}
                    }
                };
                Looper.loop();

 

public class SocketClient implements Runnable{
    private static final String TAG = "SocketClient";
    private String mAddress;
    private int mPort;
    private boolean isStop = false;
    private Socket mSocket;
    private Handler mHandleThread;
    private String mResult;
    private Handler mHandler;

    //handler 来自调用的activity
    //用于通知activity server 连接状态或其它沟通(来自server的数据)
    public SocketClient(Handler handler, String address, int port){
        mContext = context;
        mAddress = address;
        mPort = port;
        mHandler = handler;
        connectWeb();
    }

    private void connectWeb() {
        //启动一个thread去连接server, 和发送数据
        Thread th = new Thread(this);
        th.start();
    }

    @Override
    public void run() {
        while (!isStop) {
            try {
                //连接server
                mSocket = new Socket(mAddress, mPort);
                final  OutputStream outputStream = mSocket.getOutputStream();
                Log.i(TAG, "web connected");
                Message msg = mHandler.obtainMessage(InputKubeColors.MESSAGE_WEB_STATE);
                msg.arg1 = 0;
                mHandler.sendMessage(msg);

                //启动一个Looper 和handler 用于处理activity的数据发送
                Looper.prepare();
                mHandleThread = new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        if(mResult != null && !mResult.isEmpty()){
                            byte [] bytes = mResult.getBytes();
                            try {
                                outputStream.write(bytes, 0, mResult.length());
                            }catch (IOException e){

                            }

                        }

                    }
                };
                Looper.loop();
                mSocket.close();
                Log.i(TAG, "web socket close");
                return;

            } catch (IOException e) {

            }
            //server 连接失败,或断开,等待3秒,重新连接。
            try {
                Thread.sleep(3000);
            }catch (InterruptedException e){

            }
        }
    }

    //给activity调用的发送数据的方法
    //通过thread的handler发消息到thread的looper,去发送
    public void send(String result){
        mResult = result;
        if(mHandleThread != null) {
            mHandleThread.sendEmptyMessage(1);
        }
    }

    
    //结束socket client, 调用mHandleThread.getLooper().quit(); 退出Looper 结束thread
    public void destroy(){
        Log.d(TAG,"destroy");
        isStop = true;
        if(mHandleThread != null) {
            mHandleThread.getLooper().quit();
            mHandleThread = null;
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值