• android 用UDP做的心跳连接 小示例


    推荐几个不错的帖子: 

    基于Android平台的城市天气预报源码

    http://www.eoeandroid.com/thread-193468-1-1.html

    Android 用opengl 篮球游戏源码

    http://www.eoeandroid.com/thread-192486-1-1.html

    基于android北京地铁小助手有导航功能
    http://www.eoeandroid.com/thread-193758-1-1.html

    设备:客户端,服务端
    机制:UDP
    心跳思路:
    1.自检,检测自身是否连接网络
    2.检测对方是否发来信息,自身是否接收到

    public class ServerHeartService extends Service {
        private WifiManager wifiManager=null;  //用来检测自身网络是否连接
        private boolean isConnected;
        private static int errorNum = 0; //用于一次连接不成功后记录,并且,记录到4次后再对程序进行提示
     
        private static final String TAG = "ServerHeartService";
        private String getMsg = "";
     
        private int _getPort = 7894;
        private int _sendPort = 5489;
        private String _partnerIP;
        private static  boolean   ServerFlag = false;
        private int num = 1;
        private Thread thread;
        private DatagramSocket socket;
        private boolean passFlag = false;
     
        private int length = 1;
     
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
     
        @Override
        public void onCreate() {
            Log.v(TAG, "In Server onCreate");
        }
     
        @Override
        public void onDestroy() {
            System.out.println("DestoryJoinnerUdp");
            thread.stop();
            super.onDestroy();
        }
     
        @Override
        public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);
            thread = new Thread(new Runnable() {
            @Override
              public void run() {
                    while(true){
                        try {
                           //1.自测wifi是否正常
                            isConnected = isWifiConnect();
                            if(isConnected == false){
                                if(length == 1){
                                    //不能直接在Service上通知,必须经过Handler去提示
                                    Message heartMessage = ServerTestingActivity.heartHandler.obtainMessage();
                                    heartMessage.arg1 = 1;
                                    ServerTestingActivity .heartHandler.sendMessage(heartMessage);
                                    //因为是多线程,防止多次发送Handler
                                    length ++;
                                }
                                break;
                            }
     
                            SendMsg();
                            GetMsg();
                            //用于调试,可删除
                            String msg = "";
                            if( ServerFlag == false){
                                msg = "false";
                            }else{
                                msg = "true";
                            }
                            Log.d("ServerFlag", msg);
                            //记录未接收到客户端发来的消息 +1
                            if( ServerFlag == false){
                                errorNum ++;
                            }else{
                                errorNum = 0;
                            }
     
                            if(errorNum == 4){
                                ServerHeartMsg("客户端网络故障!");
                                break;
                            }
                        }catch(Exception e){
                            e.printStackTrace();
                        }
                    }
                }
            });
            thread.start();
        }
        private boolean isWifiConnect(){
            try{
                ConnectivityManager conManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
                NetworkInfo mWifi = conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                return mWifi.isConnected();
            }catch(Exception e){
                return false;
            }
    }
     
    // 将控制信息已广播的形式发送到Activity.
        private void ServerHeartMsg(String str) {
            final Intent intent = new Intent();
            intent.setAction(Constants.Controller.UDP_BORADCAST);
            intent.putExtra(UDPData.UDP_HEART_ERROR, str);
            sendBroadcast(intent);
        }
     
        public void GetMsg() throws IOException, InterruptedException{
            try {
                socket = new DatagramSocket(_getPort);
                Log.d(TAG, "Server连接到端口");
                byte data[] = new byte[256];
                DatagramPacket packet = new DatagramPacket(data, data.length);
            if(passFlag == false){
                socket.setSoTimeout(100000);
            }else{
                socket.setSoTimeout(3000);
            }
            socket.receive(packet);
            controlFlag = true;
            passFlag = true;
            Log.d(TAG, "Server接收到信息");
            getMsg = new String(packet.getData(), packet.getOffset(), packet.getLength());
            socket.close();
        } catch (SocketException e) {
            Log.d(TAG, "Server未找到服务器");
            socket.close();
            controlFlag = false;
            e.printStackTrace();
        } catch (UnknownHostException e) {
            Log.d(TAG, "Server未连接到服务器");
            socket.close();
            controlFlag = false;
            e.printStackTrace();
        } catch (IOException e) {
            Log.d(TAG, "Server消息未接收成功");
            socket.close();
            controlFlag = false;
            e.printStackTrace();
        }
    }
     
        public void SendMsg() throws IOException{
            try {
                Thread.sleep(1000);
                socket = new DatagramSocket();
                InetAddress serverAddress = InetAddress.getByName(客户端IP);
                String str = "服务端网络故障!";
                byte data[] = str.getBytes();
                DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, _sendPort);
                socket.send(packet);
                Log.d(TAG, "Server消息发送成功");
                socket.close();
            } catch (SocketException e) {
                Log.d(TAG, "Server未找到服务器");
                socket.close();
                e.printStackTrace();
            } catch (UnknownHostException e) {
                Log.d(TAG, "Server未连接到服务器");
                socket.close();
                e.printStackTrace();
            } catch (IOException e) {
                Log.d(TAG, "Server消息未发送成功");
                socket.close();
                e.printStackTrace();
            } catch (InterruptedException e) {
                Log.d(TAG, "Sleep线程");
                socket.close();
                e.printStackTrace();
            }
        }
    }

    Server端接收广播: -----> ServerTestActivity

    //定义心跳广播
        private BroadcastReceiver udpHeartReceiver = new BroadcastReceiver() {
            @Override
             public void onReceive(Context context, Intent intent) {
                    //因为只有连接失败才会发送广播,所以 getStringExtra 一定有值,所以不需要去 getStringExtra == null去做判断
                    String udpHeart = intent.getStringExtra(UDPData.UDP_HEART_ERROR);
                    //msgHeart = udpHeart;
                    Toast.makeText(getApplicationContext(), udpHeart,Toast.LENGTH_SHORT).show();
                }
        };
    //注册心跳
        IntentFilter filter2 = new IntentFilter();
        filter2.addAction(Constants.Controller.UDP_BORADCAST);
        registerReceiver(udpHeartReceiver, filter2);
     
        //启动心跳
        intentService = new Intent();
        intentService.setClass(this, ControllerHeartService.class);
        startService(intentService);
     
        //停止心跳
        stopService(intentService);

    客户端同理,可自已写下,在这里我就不贴代码了

  • 相关阅读:
    B1031
    B1021
    B1021
    B1021
    Android 系统服务一览表
    MULTI-INTERFACE CONNECTIVITY ON ANDROID
    ConnectivityManager 确定和监控网络连接状态
    Android系统各种类型的service刨根解读
    Android Netd
    Android am 指令的使用
  • 原文地址:https://www.cnblogs.com/vus520/p/2650899.html
Copyright © 2020-2023  润新知