package com.gogolook.uicomparerunner.socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import android.util.Log;
public class SocketClient {
public static final int STAUTS_WAITING = 0x1000;
public static final int STAUTS_CONNECTED = 0x1001;
public static final int STAUTS_DISCONNECTED = 0x1002;
private int status = STAUTS_WAITING;
private String address = "192.168.23.21";// 連線的ip
private int port = 8765;// 連線的port
private Socket socket;
private InetSocketAddress isa;
private SocketStatusListener mSocketStatusListener;
public interface SocketStatusListener {
public void onStatusChanged();
public void onSocketException(Exception e);
public void onRead(byte[] readByte);
}
public interface OnWriteCallBackListener {
public void onWriteCallBack();
}
public SocketClient(String address, int port, SocketStatusListener socketStatusListener) {
this.address = address;
this.port = port;
mSocketStatusListener = socketStatusListener;
}
public SocketClient connect() {
status = STAUTS_WAITING;
socket = new Socket();
isa = new InetSocketAddress(this.address, this.port);
new Thread(new Runnable() {
@Override
public void run() {
try {
socket.connect(isa, 10000);
status = STAUTS_CONNECTED;
if (mSocketStatusListener != null)
mSocketStatusListener.onStatusChanged();
} catch (IOException e) {
e.printStackTrace();
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
read();
}
}).start();
return this;
}
public SocketClient write(final String message) {
return write(message, null);
}
public SocketClient write(final String message, final OnWriteCallBackListener onWriteCallBackListener) {
return write(message.getBytes(), onWriteCallBackListener);
}
public SocketClient write(final byte[] bytes, final OnWriteCallBackListener onWriteCallBackListener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
OutputStream out = socket.getOutputStream();
// 送出字串
out.write(bytes);
Log.w(SocketClient.class.getSimpleName(), "Write to Socket Success!");
if (onWriteCallBackListener != null)
onWriteCallBackListener.onWriteCallBack();
} catch (java.io.IOException e) {
Log.w(SocketClient.class.getSimpleName(), "Write to Socket Fail!");
Log.w(SocketClient.class.getSimpleName(), "IOException :" + e.toString());
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
}
}).start();
return this;
}
public SocketClient read() {
try {
byte[] readByte = new byte[socket.getReceiveBufferSize()]; // 10,832
int bytesRead = socket.getInputStream().read(readByte);
if (bytesRead == -1) {
close();
return this;
}
if (mSocketStatusListener != null) {
mSocketStatusListener.onRead(readByte);
}
read();
} catch (java.io.IOException e) {
Log.w(SocketClient.class.getSimpleName(), "Read from Socket Fail!");
Log.w(SocketClient.class.getSimpleName(), "IOException :" + e.toString());
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
return this;
}
public void close() {
write(SocketInstruction.SOCKET_CLOSE, new OnWriteCallBackListener() {
@Override
public void onWriteCallBack() {
try {
socket.close();
status = STAUTS_DISCONNECTED;
if (mSocketStatusListener != null)
mSocketStatusListener.onStatusChanged();
} catch (IOException e) {
e.printStackTrace();
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
socket = null;
}
});
}
public boolean isWaiting() {
return status == STAUTS_WAITING;
}
public boolean isConnected() {
return status == STAUTS_CONNECTED;
}
}