简单封装Socket的读写,前后端分离,以及遇到的一些坑

这篇博客分享了作者在开发WIFI配置APP时,如何简单封装和使用Socket,以及遇到的线程、异常处理等问题。通过TcpClient和SocketTransceiver类实现Socket的读写,遇到的问题包括:强制抛出连接异常的需求、只能接收特定服务端数据、主线程执行网络操作异常。作者通过线程管理和异常处理进行了改进,并强调了代码封装和问题分享的重要性。

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

    公司说要弄个简单的WIFI配置APP,要使用socket,之前都没用过socket,然后搜了各种demo,看了各种教程,觉得都是些没有封装的,不想以后遇到了又要去看去重写,也看了像mina这样的大框架,但觉的在安卓上完全是大材小用,且也比较复杂,毕竟mina主要服务于后台的,所以想写一个既简单又实用的列子。

    这个demo我也是搜到网上的简单封装Socket的demo,使用的时候遇到一些坑,并且自己想进一步分离逻辑与视图,所以把自己遇到的问题和改进分享出来,有问题多交流,共同进步。

    主要用了两个类:一个是TcpClient.java,用来连接socket,另一个SocketTransceiver.java,用来Socket的读写封装。

    TcpClient.java的代码如下:

public abstract class TcpClient implements Runnable {

    private String IP;
    private int port;
    boolean connect = false;
    private SocketTransceiver transceiver;
    private Socket socket;

    public void connect(String IP, int port) {
        this.IP = IP;
        this.port = port;
        new Thread(this).start();
    }

    @Override
    public void run() {

        transceiver = new SocketTransceiver() {
            @Override
            public void onReceive(String s) {
                TcpClient.this.onReceive(s);
            }

            @Override
            public void onConnectBreak() {
                TcpClient.this.onConnectBreak();
            }

            @Override
            public void onSendSuccess(String s) {
                TcpClient.this.onSendSuccess(s);
            }


        };
        try {
//            socket = new Socket(IP, port);
//            socket.setSoTimeout(1000);
            socket = new Socket();
            socket.connect(new InetSocketAddress(IP, port), 1000);
            connect = true;
//
//            try{
//                  socket.sendUrgentData(0xFF); //发送心跳包
//            }catch(Exception ex){
//                this.onConnectFalied();
//                 Log.i("ssssss", ex.getMessage().toString());
//            }

            this.onConnectSuccess();
            transceiver.start(socket);
        } catch (IOException e) {
            this.onConnectFalied();
            e.printStackTrace();
        }
    }

    public boolean isConnected() {
        return connect;
    }

    public void disConnected() {
        connect = false;
        if (transceiver != null) {
            transceiver.stop();
            transceiver = null;
        }
    }

    public SocketTransceiver getTransceiver() {
        return transceiver;
    }


    public abstract void onConnectSuccess();

    public abstract void onConnectBreak();

    public abstract void onReceive(String s);

    public abstract void onConnectFalied();

    public abstract void onSendSuccess(String s);

}
SocketTransceiver.java的代码如下:
public abstract class SocketTransceiver implements Runnable {

    private Socket socket;
    private InputStream inputStream;
    private OutputStream outputStream;
    private boolean 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值