--- /dev/null
+package com.zhixun.blesdk.hssdk.alisocket;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+
+public class SocketClient {
+ private Socket socket = null;
+ private InputStream mInputStream = null;
+ private BufferedReader reader = null;
+ private PrintWriter writer = null;
+ private OnMessageReceivedListener messageListener;
+ private String serverIpAddress;
+ private int serverPort;
+
+ public void setServerIpAddress(String serverIpAddress) {
+ this.serverIpAddress = serverIpAddress;
+ }
+
+ public void setServerPort(int serverPort) {
+ this.serverPort = serverPort;
+ }
+
+ public void connect() {
+ try {
+ socket = new Socket();
+ SocketAddress socAddress = new InetSocketAddress(serverIpAddress, serverPort);
+ socket.connect(socAddress, 2000);
+ // 启动心跳线程
+ socket.setKeepAlive(true);
+ mInputStream = socket.getInputStream();
+ reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+ writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
+ startReadMsg();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void startReadMsg() {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+
+ byte[] arrayOfByte = new byte[1024];
+ try {
+ while (!socket.isClosed()) {
+
+ //方法三:基于字符的读取或基于字节的读取,如果bytesRead一直不返回-1,可以尝试替换以下方法
+ if (mInputStream.available() > 0) {
+ mInputStream.read(arrayOfByte);
+ if (arrayOfByte.length > 0 && messageListener != null) {
+ // Process the entire content at once
+ messageListener.onMessageReceived(arrayOfByte);
+ }
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ // 处理连接中断的情况
+ if (messageListener != null) {
+ messageListener.onConnectionLost();
+ }
+ }
+ }
+ }).start();
+ }
+
+
+ public void sendMessage(byte[] message) {
+ if (socket != null && socket.isConnected()) {
+ writer.println(message);
+ }
+ }
+
+ public void disConnection() {
+ try {
+ if (socket != null && !socket.isClosed()) {
+ socket.close();
+ }
+ reader.close();
+ writer.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public interface OnMessageReceivedListener {
+ void onMessageReceived(byte[] message);
+
+ void onConnectionLost();
+ }
+
+
+}
import com.zhixun.blesdk.hssdk.util.SobLog;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
// private ArrayList<byte[]> msgList = new ArrayList<>();
private final int MSG_SEND = 101;//发送数据
private boolean isStart = false;
+ public boolean isCancleChat = false;
// private final int MSG_CHECKSENDMSG = 102;//检测普通数据
private class MsgLooperThread extends Thread {
switch (msg.what) {
case MSG_SEND:
isStart = true;
+ if(isCancleChat){
+ Iterator<byte[]> iterator = queueMsg.iterator();
+ while (iterator.hasNext()) {
+ byte[] element = iterator.next();
+ byte[] head = new byte[3];
+ System.arraycopy(element,0,head,0,3);
+ if (ByteTools.byteArrToHex(head).equals("73021F")) { // 如果是偶数
+ iterator.remove(); // 移除该元素
+ }
+ }
+ isCancleChat = false;
+ }
+
byte[] data = queueMsg.poll();
if(data==null){
mSendMsgHandle.sendEmptyMessageDelayed(MSG_SEND,40);
return;
}
+
byte[] sendBytes = new byte[data.length-1];
System.arraycopy(data,1,sendBytes,0,sendBytes.length);
int channel = 0xFF & data[0];