package com.james.uicomparerunner.socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
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 ServerSocket server;
private Socket socket;
private final int serverPort = 8765;// 要監控的port
private SocketStatusListener mSocketStatusListener;
public interface SocketStatusListener {
public void onStatusChanged();
public void onSocketException(Exception e);
public void onRead(String recieve);
}
public interface OnWriteCallBackListener {
public void onWriteCallBack();
}
public SocketServer(SocketStatusListener socketStatusListener) {
mSocketStatusListener = socketStatusListener;
}
public SocketServer waitForConnection() {
try {
server = new ServerSocket(serverPort);
status = STAUTS_WAITING;
if (mSocketStatusListener != null)
mSocketStatusListener.onStatusChanged();
System.out.println("Socket Initialized Success");
} catch (java.io.IOException e) {
System.out.println("Socket Initialized Fail!");
System.out.println("IOException :" + e.toString());
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
new Thread(new Runnable() {
@Override
public void run() {
if (socket == null || !socket.isConnected()) {
try {
socket = server.accept();
System.out.println("Connected from : InetAddress = " + socket.getInetAddress());
status = STAUTS_CONNECTED;
if (mSocketStatusListener != null)
mSocketStatusListener.onStatusChanged();
} catch (IOException e) {
e.printStackTrace();
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
}
read();
}
}).start();
return this;
}
public SocketServer write(final String message) {
return write(message, null);
}
public SocketServer write(final String message, final OnWriteCallBackListener onWriteCallBackListener) {
return write(message.getBytes(), onWriteCallBackListener);
}
public SocketServer write(final byte[] bytes, final OnWriteCallBackListener onWriteCallBackListener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
OutputStream out = socket.getOutputStream();
// 送出字串
out.write(bytes);
System.out.println("Write to Socket Success!");
if (onWriteCallBackListener != null)
onWriteCallBackListener.onWriteCallBack();
} catch (java.io.IOException e) {
System.out.println("Write to Socket Fail!");
System.out.println("IOException :" + e.toString());
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
}
}).start();
return this;
}
public SocketServer read() {
try {
byte[] readByte = new byte[1024];
int bytesRead = socket.getInputStream().read(readByte);
if (bytesRead == -1) {
close();
return this;
}
String recieve = new String(readByte).trim();
if (mSocketStatusListener != null)
mSocketStatusListener.onRead(recieve);
if (!recieve.equalsIgnoreCase(SocketInstruction.SOCKET_CLOSE)) {
read();
}
} catch (java.io.IOException e) {
System.out.println("Read from Socket Fail!");
System.out.println("IOException :" + e.toString());
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
return this;
}
public void close() {
//
status = STAUTS_DISCONNECTED;
if (mSocketStatusListener != null)
mSocketStatusListener.onStatusChanged();
try {
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
if (mSocketStatusListener != null)
mSocketStatusListener.onSocketException(e);
}
socket = null;
server = null;
}
public boolean isWaiting() {
return status == STAUTS_WAITING;
}
public boolean isConnected() {
return status == STAUTS_CONNECTED;
}
public String getInetAddress() {
return socket.getInetAddress().toString();
}
}