| package com.dayu.henanlibrary.net; | 
|   | 
| import android.content.Context; | 
| import android.net.ConnectivityManager; | 
| import android.net.NetworkInfo; | 
| import android.text.TextUtils; | 
| import android.util.Log; | 
|   | 
| import com.dayu.henanlibrary.HeNanApplication; | 
| import com.dayu.henanlibrary.activity.HomeActivity; | 
| import com.dayu.henanlibrary.dao.HNBaseDaoSingleton; | 
| import com.dayu.henanlibrary.dbBean.AdminDataBean; | 
| import com.easysocket.EasySocket; | 
| import com.easysocket.callback.SimpleCallBack; | 
| import com.easysocket.entity.OriginReadData; | 
| import com.easysocket.entity.SocketAddress; | 
| import com.easysocket.exception.RequestTimeOutException; | 
| import com.easysocket.interfaces.conn.ISocketActionListener; | 
| import com.easysocket.interfaces.conn.SocketActionListener; | 
| import com.easysocket.utils.HexUtil; | 
| import com.tencent.bugly.crashreport.CrashReport; | 
|   | 
|   | 
| /** | 
|  * Copyright (C), 2022, | 
|  * Author: zuo | 
|  * Date: 2022/2/8 21:30 | 
|  * Description: Socket通信 | 
|  */ | 
| public class SocketNet { | 
|     public static SocketNet socketNet; | 
|     SocketCallBack myCallBack; | 
|     //    byte[] dataMessage; | 
|     boolean isTest = false; | 
|     Context mContext; | 
|   | 
|     CallbackSender mSender; | 
|   | 
|     public static SocketNet getInstance() { | 
|         if (socketNet == null) { | 
|             socketNet = new SocketNet(); | 
|         } | 
|   | 
|         return socketNet; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 发送一个的消息, | 
|      */ | 
|     public void sendTestMessage(byte[] dataMessage, String AFN, SocketCallBack callBack) { | 
|         myCallBack = callBack; | 
|         isTest = false; | 
|         mSender = new CallbackSender(); | 
|         mSender.setAFN(AFN); | 
|         mSender.setData(dataMessage); | 
|         if (isNetworkAvailable(HeNanApplication.myApplication.application)) { | 
|             // 发送 | 
|             if (EasySocket.getInstance().getDefconnection() != null) { | 
| //            EasySocket.getInstance().upMessage(dataMessage); | 
|                 EasySocket.getInstance().upCallbackMessage(mSender).onCallBack(new SimpleCallBack(AFN) { | 
|                     @Override | 
|                     public void onResponse(OriginReadData data) { | 
|   | 
|                         try { | 
|                             mSender = null; | 
|                             myCallBack = null; | 
|                             Log.i("SocketActionListener", "SimpleCallBack收到数据-->" + HexUtil.bytesToHex(data.getBodyBytes())); | 
|                             SocketData socketData = new SocketData(); | 
|                             socketData.setBodyData(data.getBodyBytes()); | 
|                             socketData.setHeaderData(data.getHeaderData()); | 
| //            dataMessage = null; | 
|                             if (callBack != null) { | 
|                                 callBack.onSocketResponse(socketData); | 
|                             } | 
|                         } catch (Exception e) { | 
|                             e.printStackTrace(); | 
|                         } | 
|                     } | 
|   | 
|                     @Override | 
|                     public void onError(Exception e) { | 
|                         super.onError(e); | 
|                         mSender = null; | 
|                         myCallBack = null; | 
|                         try { | 
|                             if (e instanceof RequestTimeOutException) { | 
|                                 // 在这里执行需要在主线程中执行的操作 | 
|                                 callBack.onSocketError(-3, "请求超时,正在重试"); | 
|                                 //超时后重新连接 | 
|                                 EasySocket.getInstance().disconnect(true); | 
|                             } | 
|   | 
|                         } catch (Exception ex) { | 
|                             throw new RuntimeException(ex); | 
|                         } | 
|                     } | 
|                 }); | 
|             } else { | 
|                 callBack.onSocketError(-2, "与服务器连接断开,请检查网络稍后再试"); | 
|                 HeNanApplication.myApplication.initEasySocket(false, null); | 
|             } | 
|         } else { | 
|             callBack.onSocketError(-2, "请检查网络连接"); | 
|         } | 
|   | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 测试socket是否连接通畅 | 
|      * | 
|      * @param context | 
|      */ | 
|     public void isConnect(Context context) { | 
|         Log.i("SocketActionListener", "测试连接"); | 
|         isTest = true; | 
|         mContext = context; | 
|         if (EasySocket.getInstance().getDefOptions().getSocketAddress() != null && !HeNanApplication.myApplication.isDoInitMachine) { | 
| //            EasySocket.getInstance().disconnect(false); | 
| //            EasySocket.getInstance().connect(); | 
|         } else { | 
| //            ToastUtil.show(mContext, "Socket地址为空"); | 
|         } | 
|     } | 
|   | 
|   | 
|     public interface CreateBack { | 
|         void Success(); | 
|   | 
|         void error(); | 
|     } | 
|   | 
|     /** | 
|      * socket行为监听 | 
|      */ | 
|     public ISocketActionListener socketActionListener = new SocketActionListener() { | 
|         /** | 
|          * socket连接成功 | 
|          * @param socketAddress | 
|          */ | 
|         @Override | 
|         public void onSocketConnSuccess(SocketAddress socketAddress) { | 
|   | 
|   | 
|             Log.i("SocketActionListener1111", "连接成功"); | 
|             HeNanApplication.myApplication.isConncet = true; | 
|             try { | 
|                 AdminDataBean adminData = HNBaseDaoSingleton.getInstance(HeNanApplication.myApplication.application).adminDao().findFirst(); | 
|                 Log.i("SocketActionListener1111", "isDoInitMachine==" + HeNanApplication.myApplication.isDoInitMachine + ""); | 
|                 //每次连接成功注册一次设备 | 
|                 if (!HeNanApplication.myApplication.isDoInitMachine) { | 
|                     Log.i("SocketActionListener1111", "isDoInitMachine"); | 
|                     if (HeNanApplication.myApplication.ipBean != null && adminData != null) { | 
|                         if (!TextUtils.isEmpty(adminData.getAddressCode()) && !HeNanApplication.myApplication.isCreate) { | 
|                             Log.i("SocketActionListener1111", "initMachineRequestBean"); | 
|                             HeNanApplication.myApplication.initMachineRequestBean(HeNanApplication.myApplication.ipBean.getIp(), HeNanApplication.myApplication.ipBean.getPort(), adminData.getAddressCode()); | 
|   | 
|                         } | 
|                     } | 
|                 } | 
|                 try { | 
|                     if (mSender != null) { | 
|                         sendTestMessage(mSender.getData(), mSender.getAFN(), myCallBack); | 
|                     } | 
|                 } catch (Exception e) { | 
|                     e.printStackTrace(); | 
|                 } | 
|   | 
|   | 
|             } catch (Exception e) { | 
|                 CrashReport.postCatchedException(e); | 
|             } | 
|             rushState(); | 
|         } | 
|   | 
|         /** | 
|          * socket连接失败 | 
|          * @param socketAddress | 
|          * @param isNeedReconnect 是否需要重连 | 
|          */ | 
|         @Override | 
|         public void onSocketConnFail(SocketAddress socketAddress, boolean isNeedReconnect) { | 
|             HeNanApplication.myApplication.isConncet = false; | 
|             rushState(); | 
|             Log.i("SocketActionListener", "socket连接失败"); | 
| //            if (myCallBack != null) { | 
| //                myCallBack.onSocketError(-1, "连接数据中心失败,请检查网络"); | 
| //            } | 
| //            myCallBack = null; | 
|         } | 
|   | 
|         /** | 
|          * socket断开连接 | 
|          * @param socketAddress | 
|          * @param isNeedReconnect 是否需要重连 | 
|          */ | 
|         @Override | 
|         public void onSocketDisconnect(SocketAddress socketAddress, boolean isNeedReconnect) { | 
|             Log.i("SocketActionListener", "---> socket断开连接,是否需要重连:" + isNeedReconnect); | 
|             HeNanApplication.myApplication.isConncet = false; | 
|             rushState(); | 
|             try { | 
|                 if (myCallBack != null) { | 
|                     myCallBack.onSocketError(-2, "与服务器连接断开,请检查网络"); | 
|                 } | 
|                 myCallBack = null; | 
|             } catch (Exception e) { | 
|                 throw new RuntimeException(e); | 
|             } | 
|         } | 
|   | 
|   | 
|         /** | 
|          * socket接收的数据 | 
|          * @param socketAddress | 
|          * @param originReadData | 
|          */ | 
|         @Override | 
|         public void onSocketResponse(SocketAddress socketAddress, OriginReadData originReadData) { | 
|             super.onSocketResponse(socketAddress, originReadData); | 
|             Log.i("SocketActionListener", "SocketActionListener收到数据-->" + HexUtil.bytesToHex(originReadData.getBodyBytes())); | 
| //            SocketData socketData = new SocketData(); | 
| //            socketData.setBodyData(originReadData.getBodyBytes()); | 
| //            socketData.setHeaderData(originReadData.getHeaderData()); | 
| ////            dataMessage = null; | 
| //            if (myCallBack != null) { | 
| //                myCallBack.onSocketResponse(socketData); | 
| //            } | 
| //            myCallBack = null; | 
|         } | 
|     }; | 
|   | 
|     private void rushState() { | 
|         try { | 
|             if (HomeActivity.homeActivity != null) { | 
|                 HomeActivity.homeActivity.rushState(); | 
|             } | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|         } | 
|     } | 
|   | 
|     // 检查网络连接是否可用 | 
|     public boolean isNetworkAvailable(Context context) { | 
|         if (context != null) { | 
|             ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); | 
|             if (connectivityManager != null) { | 
|                 NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); | 
|                 return activeNetworkInfo != null && activeNetworkInfo.isConnected(); | 
|             } | 
|         } | 
|         return false; | 
|     } | 
|   | 
| } |