很难理解wifi连接如何工作

时间:2015-11-27 08:52:26

标签: android android-wifi

我有一个应用程序可以监听指示的ip和端口。我知道如何连接,如何接收数据。

事情是:

  • 我不明白如何确认连接是否成功
  • 我不明白如何检测连接丢失
  • 我不明白退出应用程序时如何退出AsyncTask(使用菜单)

这是我用来获取数据的类:

public final class MyClientTask extends AsyncTask<Void, Void, Void> {
    BufferedReader br = null;
    String dstAddress;
    int dstPort;
    String response = "";

    public MyClientTask(String addr, int port){
        dstAddress = addr;
        dstPort = port;
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        Socket socket = null;
        try {
            socket = new Socket(dstAddress, dstPort);

            ByteArrayOutputStream byteArrayOutputStream =
                    new ByteArrayOutputStream(1024);
            byte[] buffer = new byte[1024];

            //Instanciation de l'inputStreamReader
            InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());

            // creation nouveau bufferreader
            br = new BufferedReader(inputStreamReader);

            StringBuilder msgBuilder = new StringBuilder();
            // on évite String = String + char qui fait des créations de builders automatiques en java.
            boolean ended = false;
            while (!ended) {
                int nextChar = inputStreamReader.read();
                if (nextChar == -1) {
                    ended = true; // <= fin du stream
                } else if (nextChar == 03) {

                    String maChaine="";
                    // fin du message
                    maChaine = msgBuilder.toString();

                    //récupération du char après <STX>
                    Character nbChamps = maChaine.charAt(1);
                    //test pour savoir si c'est une alerte
                    if(nbChamps == '7'){
                        //insertion de l'alerte dans la BDD
                        BDDAlerte.insertAlerte1(maChaine);
                        //creation de la notif
                        createNotification();

                    }
                    //ici les tests splits pour le nombre de champs et inserer dans BdD ou faire ce qu'il faut

                    //suppVieillesAlertes();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //find listview to populate
                            final ListView lvItems = (ListView)findViewById(R.id.listView1);
                            //setup cursor adapter using Cursor from last step
                            final AlerteAdapter todoAdapter = new AlerteAdapter(getBaseContext(), BDDAlerte.getAllRows(),0);

                            lvItems.setAdapter(todoAdapter);
                        }
                    });
                    // réinitialisation du builder
                    msgBuilder.setLength(0);
                } else {
                    msgBuilder.append((char)nextChar);
                }
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "IOException: " + e.toString();
        }
        finally{
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

我的退出按钮位于onOptionsItemSelected的应用程序菜单中。

如果我没有提供所有数据,我会在这里解决问题。

西蒙

2 个答案:

答案 0 :(得分:0)

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
      = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

在构造套接字之前,应首先检查网络状态

如果在读取数据时抛出异常,则意味着连接丢失。

你可以定义一个布尔字段“running”,initial为true,在应用程序退出时将其设置为false,在循环中检查它的值,如下所示:

 while (!ended&&running) {
            int nextChar = inputStreamReader.read();
            if (nextChar == -1) {
                ended = true; // <= fin du stream
            } 
// ......
}

答案 1 :(得分:0)

首先创建一个单独的类来检查连接并通过调用方法来放置条件,而不仅仅是继续进行套接字..

公共类MobileConnectivity {

curses