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