推荐几个不错的帖子:

基于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);

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

更多相关文章

  1. 调用android手机微博客户端发送微博
  2. android -上传文件到服务器
  3. Android发送SOAP数据给服务器调用webservice,实现手机号归属地查
  4. Android基本功:Handler消息传送机制
  5. android客户端和servlet服务端的简单登录实现
  6. 理解 Android 消息机制

随机推荐

  1. 关于android WebViewClient和WebChromeCl
  2. android 模拟器中启用相机API支持
  3. Android(安卓)Menu 用法
  4. Android自动化测试初探(二): Hierarchyview
  5. Android(安卓)10 创建文件失败
  6. Android的service相关讲解
  7. Android下SQLite3数据库操作笔记
  8. 基于Paho Android(安卓)Service 实现MQTT
  9. 转:善用Android预定义样式
  10. 剪切图片-扩展android 选择图片(从手机照