hxb
2021-12-07 05552c8b73a16b69aded2d4d877fa968c29e7cce
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/TcpClient.java
@@ -2,6 +2,7 @@
import com.hdl.sdk.common.utils.ByteUtils;
import com.hdl.sdk.common.utils.ThreadToolUtils;
import com.hdl.sdk.socket.SocketBoot;
import com.hdl.sdk.socket.SocketOptions;
@@ -14,7 +15,7 @@
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
@@ -22,6 +23,11 @@
 * Created by Tong on 2021/9/15.
 */
public final class TcpClient implements IClient {
    /*
     *接收数据的缓冲区
     */
    private final List<Byte> byteList;
    private final byte[] head = "Topic:".getBytes();
    private SocketOptions socketOptions;
@@ -33,6 +39,7 @@
    private byte[] readBuffer;
    private TcpClient(String ip, int port, SocketOptions socketOptions) {
        this.byteList = new ArrayList<>();
        this.socketOptions = socketOptions;
        this.ip = ip;
        this.port = port;
@@ -84,18 +91,104 @@
        return socketOptions;
    }
    /// <summary>
    /// 获取内容长度
    /// </summary>
    /// <param name="topMsgs"></param>
    /// <returns></returns>
    int getLenght(String[] topMsgs)
    {
        for (int i = 0; i < topMsgs.length; i++)
        {
            String topMsg = topMsgs[i].trim();
            if (topMsg.startsWith("Length:"))
            {
                return Integer.parseInt(topMsg.replace("Length:", ""));
            }
        }
        //找不到长度
        return -1;
    }
    /// <summary>
    /// 获取主题
    /// </summary>
    /// <param name="topMsgs"></param>
    /// <returns></returns>
    private String getTopic(String[] topMsgs)
    {
        for (int i = 0; i < topMsgs.length; i++)
        {
            String topMsg = topMsgs[i].trim();
            if (topMsg.startsWith("Topic:"))
            {
                return topMsg.replace("Topic:", "");
            }
        }
        //找不到主题
        return null;
    }
    /**
     * 获取数据的开始位置
     * @param arrayList 接收到的所有数据
     * @return 数据位的开始索引
     */
    int getDataIndex(List<Byte> arrayList)
    {
        byte r = (byte)'\r';
        byte n = (byte)'\n';
        for (int i = 0; i < arrayList.size(); i++)
        {
            //找出数据内容前面的两个换行
            if (3 <= i && arrayList.get(i - 3) == r && arrayList.get(i - 2) == n && arrayList.get(i - 1) == r && arrayList.get(i) == n)
            {
                //剩余的数据
                return i + 1;
            }
        }
        return -1;
    }
    void initReceiveData(List<Byte> list) {
        int index = 0;
        boolean isMatch=false;
        for (; index < list.size() - head.length; index++) {
            isMatch=true;
            for (int j = 0, k = 0; j < head.length; j++, k++) {
                if (head[j] != list.get(index + k)) {
                    isMatch=false;
                    break;
                }
            }
            if(isMatch) {
                break;
            }
        }
        if (0 < index&&isMatch) {
            List<Byte> tempList = new ArrayList<Byte>();
            for(int i=index;i<list.size();i++)
            {
                tempList.add(list.get(index));
            }
            list=tempList;
        }
    }
    @Override
    public void onHandleResponse() throws Exception {
        final InputStream stream = getInputStream();
        if (stream != null && getOptions() != null) {
            readBuffer = new byte[1024];
            int len;
            int len=0;
            while ((len = getInputStream().read(readBuffer)) != -1) {
                IHandleMessage handleMessage = getOptions().getHandleMessage();
                if (handleMessage != null && len > 0) {
                    handleMessage.read(Arrays.copyOfRange(readBuffer, 0, len));
//                    handleMessage.read(readBuffer);
                if (handleMessage != null) {
                    byte []bytes = new byte[len];
                    System.arraycopy(readBuffer,0,bytes,0,len);
                    //完整的数据才回调
                    handleMessage.read(bytes);
                }
            }
        }