| | |
| | |
|
| | |
|
| | |
|
| | | 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;
|
| | |
| | | import java.io.OutputStream;
|
| | | import java.net.InetSocketAddress;
|
| | | import java.net.Socket;
|
| | | import java.util.ArrayList;
|
| | | import java.util.List;
|
| | |
|
| | |
|
| | |
| | | * 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;
|
| | |
|
| | |
| | | private byte[] readBuffer;
|
| | |
|
| | | private TcpClient(String ip, int port, SocketOptions socketOptions) {
|
| | | this.byteList = new ArrayList<>();
|
| | | this.socketOptions = socketOptions;
|
| | | this.ip = ip;
|
| | | this.port = port;
|
| | |
| | | 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];
|
| | | while ((getInputStream().read(readBuffer)) != -1) {
|
| | | int len=0;
|
| | | while ( (len=getInputStream().read(readBuffer)) != -1) {
|
| | | IHandleMessage handleMessage = getOptions().getHandleMessage();
|
| | | if (handleMessage != null) {
|
| | | handleMessage.read(readBuffer);
|
| | | byte []bytes = new byte[len];
|
| | | System.arraycopy(readBuffer,0,bytes,0,len);
|
| | | //完整的数据才回调
|
| | | handleMessage.read(bytes);
|
| | | }
|
| | | }
|
| | | }
|