package com.hdl.sdk.socket.client;
|
|
|
|
import com.hdl.sdk.common.utils.ThreadToolUtils;
|
import com.hdl.sdk.socket.SocketBoot;
|
import com.hdl.sdk.socket.SocketOptions;
|
import com.hdl.sdk.socket.annotation.ConnectStatus;
|
import com.hdl.sdk.socket.codec.IHandleMessage;
|
import com.hdl.sdk.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;
|
|
private TcpClient(String ip, int port, SocketOptions socketOptions) {
|
this.socketOptions = socketOptions;
|
this.ip = ip;
|
this.port = port;
|
}
|
|
public static SocketBoot init(String ip, int port, SocketOptions options) {
|
return new SocketBoot(new TcpClient(ip, port, options));
|
}
|
|
|
@Override
|
public void connect() throws Exception {
|
mSocket = getSocket();
|
SocketOptions options = getOptions();
|
mSocket.connect(new InetSocketAddress(ip, port));
|
mSocket.setTcpNoDelay(true);
|
mSocket.setReuseAddress(true);
|
mSocket.setKeepAlive(true);
|
readBuffer = new byte[options.getReadMaxBufferSize()];
|
}
|
|
|
@Override
|
public void disconnect() {
|
if (mSocket != null) {
|
try {
|
mSocket.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
@Override
|
public boolean isConnect() {
|
if (mSocket == null) {
|
return false;
|
}
|
|
return mSocket.isConnected() && !mSocket.isClosed();
|
}
|
|
|
@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) {
|
readBuffer = new byte[1024];
|
while ((getInputStream().read(readBuffer)) != -1) {
|
IHandleMessage handleMessage = getOptions().getHandleMessage();
|
if (handleMessage != null) {
|
handleMessage.read(readBuffer);
|
}
|
}
|
}
|
}
|
|
@Override
|
public 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;
|
}
|
|
|
}
|