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 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; } }