封装类
public class PZHelp_TCPClient extends Thread {
private static final String TAG = "PZHelp_TCPClient";
private Socket socket;
private String address;
private int port;
private boolean isTCPClientOpen = false;
private InputStream is = null;
private PrintWriter pw = null;
private ReceiveListener listener;
PZHelp_TCPClient(String address, int port, ReceiveListener listener) {
this.address = address;
this.port = port;
this.listener = listener;
}
@Override
public synchronized void start() {
isTCPClientOpen = true;
super.start();
}
@Override
public void run() {
while (isTCPClientOpen) {
try {
socket = new Socket(address, port);
if (socket.isConnected()) {
is = socket.getInputStream();
pw = new PrintWriter(socket.getOutputStream(), true);
listener.onSuccess();
receive();
} else {
listener.onFail("连接失败");
}
} catch (ConnectException ce) {
listener.onFail("无法连接服务器");
} catch (IOException e) {
listener.onFail("连接异常");
e.printStackTrace();
}
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void receive() {
int length;
byte[] read = new byte[4096];
byte[] buff = new byte[40960];
int buffLength = 0;
int dataLength = 0;
boolean islenfull = true;
while (isTCPClientOpen && !socket.isClosed() && !socket.isInputShutdown()) {
try {
if ((length = is.read(read)) != -1) {
Log.d(TAG, "length: " + length);
if (islenfull) {
String string = new String(read, 0, length, "GBk");
int ls = string.indexOf("<len>");
if (ls != -1) {
int le = string.substring(ls).indexOf("</len>");
if (ls == 0 && le != -1) {
dataLength = Integer.parseInt(string.substring(ls + 5, le));
if (length >= dataLength) {
listener.Receive(string);
} else {
islenfull = false;
System.arraycopy(read, 0, buff, 0, length);
buffLength = length;
}
}
}
} else {
System.arraycopy(read, 0, buff, buffLength, length);
buffLength += length;
if (buffLength >= dataLength) {
listener.Receive(new String(buff, 0, buffLength, "GBK"));
islenfull = true;
}
}
} else {
listener.onFail("服务器通讯关闭!");
break;
}
} catch (IOException e) {
listener.onFail("接收异常");
e.printStackTrace();
break;
}
}
}
public boolean send(String msg) {
try {
if (!socket.isClosed()) {
pw.println(msg);
pw.flush();
return true;
}
return false;
} catch (Exception e) {
return false;
}
}
public void close() {
isTCPClientOpen = false;
try {
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public interface ReceiveListener {
void onSuccess();
void onFail(String err);
void Receive(String response);
}
}
使用
PZHelp_TCPClient mTCPClient = new PZHelp_TCPClient("192.168.0.228", 8888, mListener);
mTCPClient.start();
... ...
PZHelp_TCPClient.ReceiveListener mListener = new PZHelp_TCPClient.ReceiveListener() {
@Override
public void onSuccess() {
}
@Override
public void onFail(String err) {
Log.e(TAG, "onFail: " + err);
}
@Override
public void Receive(String response) {
Log.d(TAG, "Receive: "+response);
}
};