package com.hdl.sdk.link.socket.client;
|
|
|
|
import com.hdl.sdk.link.common.utils.LogUtils;
|
import com.hdl.sdk.link.common.utils.ThreadToolUtils;
|
import com.hdl.sdk.link.socket.TcpSocketBoot;
|
import com.hdl.sdk.link.socket.SocketOptions;
|
import com.hdl.sdk.link.socket.annotation.ConnectStatus;
|
import com.hdl.sdk.link.socket.bean.Packet;
|
import com.hdl.sdk.link.socket.codec.IHandleMessage;
|
import com.hdl.sdk.link.socket.listener.ConnectStatusListener;
|
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.net.InetSocketAddress;
|
import java.net.Socket;
|
import java.util.List;
|
|
|
/**
|
* Created by Tong on 2021/9/15.
|
*/
|
public final class TcpClient implements IClient {
|
|
|
private SocketOptions socketOptions;
|
|
private final String ip;
|
private final int port;
|
|
private Socket mSocket;
|
|
private byte[] readBuffer = new byte[4*1024];
|
|
private TcpClient(String ip, int port, SocketOptions socketOptions) {
|
this.socketOptions = socketOptions;
|
this.ip = ip;
|
this.port = port;
|
socketOptions.setIp(ip);
|
socketOptions.setPort(port);
|
}
|
|
public static TcpSocketBoot init(String ip, int port, SocketOptions options) {
|
return new TcpSocketBoot(new TcpClient(ip, port, options));
|
}
|
|
|
|
|
@Override
|
public void connect() throws Exception {
|
mSocket = getSocket();
|
mSocket.connect(new InetSocketAddress(ip, port), 3 * 1000);
|
mSocket.setTcpNoDelay(true);
|
mSocket.setReuseAddress(true);
|
// mSocket.setKeepAlive(true);
|
// mSocket.setSoTimeout(12 * 1000);
|
}
|
|
|
|
|
@Override
|
public void disconnect() {
|
if (mSocket != null) {
|
try {
|
mSocket.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
@Override
|
public synchronized SocketOptions getOptions() {
|
if (socketOptions == null) {
|
socketOptions = new SocketOptions();
|
}
|
return socketOptions;
|
}
|
|
@Override
|
public void onHandleResponse() throws Exception {
|
final InputStream stream = getInputStream();
|
if (stream != null && getOptions() != null) {
|
int len = 0;
|
// while ((len = getInputStream().read(readBuffer)) != -1) {
|
if ((len = getInputStream().read(readBuffer)) != -1) {
|
IHandleMessage handleMessage = getOptions().getHandleMessage();
|
if (handleMessage != null) {
|
byte[] bytes = new byte[len];
|
System.arraycopy(readBuffer, 0, bytes, 0, len);
|
// LogUtils.i("接收到TCP数据+" + new String(bytes));
|
//完整的数据才回调
|
handleMessage.read(new Packet(getOptions().getIp(), bytes, mSocket));
|
}
|
}
|
}
|
}
|
|
@Override
|
public synchronized void sendMsg(byte[] msg) throws Exception {
|
final OutputStream outputStream = getOutStream();
|
if (outputStream != null && getOptions() != null) {
|
try {
|
// IHandleMessage handleMessage = getOptions().getHandleMessage();
|
// handleMessage.write(handleMessage.write(msg));
|
getOutStream().write(msg);
|
|
}finally {
|
outputStream.flush();
|
}
|
}
|
}
|
|
|
/**
|
* 处理连接状态
|
*/
|
public void onConnectStatus(int status) {
|
// ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
|
// @Override
|
// public void run() {
|
final List<ConnectStatusListener> list = getOptions().getConnectStatusListener();
|
if (list != null && !list.isEmpty()) {
|
for (ConnectStatusListener listener : list) {
|
if (status == ConnectStatus
|
.CONNECTING) {
|
listener.onConnecting();
|
} else if (status == ConnectStatus.CONNECTED) {
|
listener.onConnected();
|
} else if (status == ConnectStatus
|
.DISCONNECT) {
|
listener.onConnectFailed();
|
}
|
}
|
}
|
// }
|
// });
|
}
|
|
|
private synchronized Socket getSocket() {
|
return new Socket();
|
}
|
|
private InputStream getInputStream() {
|
if (mSocket != null && mSocket.isConnected() && !mSocket.isClosed()) {
|
try {
|
return mSocket.getInputStream();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return null;
|
}
|
|
|
private OutputStream getOutStream() {
|
if (mSocket != null && mSocket.isConnected() && !mSocket.isClosed()) {
|
try {
|
return mSocket.getOutputStream();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return null;
|
}
|
|
|
}
|