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.core.protocol.LinkMessageDecoder;
|
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;
|
|
if ((len = stream.read(readBuffer)) == -1) {
|
throw new Exception("网关断开");
|
}
|
|
byte[] bytes = new byte[len];
|
System.arraycopy(readBuffer, 0, bytes, 0, len);
|
socketOptions.getHandleMessage().read(new Packet(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) {
|
switch (status) {
|
case ConnectStatus
|
.CONNECTING:
|
listener.onConnecting();
|
break;
|
case ConnectStatus
|
.CONNECTED:
|
listener.onConnected();
|
break;
|
case ConnectStatus
|
.DISCONNECT:
|
listener.onConnectFailed();
|
break;
|
}
|
}
|
}
|
}
|
});
|
}
|
|
|
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;
|
}
|
|
|
}
|