公司说要弄个简单的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