2016-11-01 4 views
0

Ich habe mein Android-Gerät an den WLAN-Anschluss meines Laptops angeschlossen. Nachdem ich die IP-Adresse eingegeben und auf "OK" in der Android-App geklickt habe, kann ich keine Pakete an die Adresse in Wireshark (Paket-Sniffer) findenWarum funktioniert dieses Android Socket Programm nicht?

Ich habe dies dem Manifest des Android-Projekts hinzugefügt:

<uses-permission android:name="android.permission.INTERNET"/>

Android Code:

private boolean attemptOpenDoor(){ 

    // Store values at the time of the login attempt. 
    String studentId = mStudentIdView.getText().toString(); 
    String password = mPasswordView.getText().toString(); 

    final EditText et = new EditText(this); 
    new AlertDialog.Builder(this).setTitle("please input IP address") 
      .setIcon(android.R.drawable.ic_dialog_info).setView(et) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        IPAddr = et.getText().toString(); 
       } 
      }).setNegativeButton("cancel", null).show(); 

    try { 
     Socket socket = new Socket(); 
     socket.connect(new InetSocketAddress(IPAddr, 8866), 5000); 
     OutputStream ou = socket.getOutputStream(); 
     ou.write((studentId+password).getBytes("UTF-8")); 
     ou.close(); 
     socket.close(); 
    }catch (SocketTimeoutException aa) { 
     //连接超时 在UI界面显示消息 
     AlertDialog alertDialog = new AlertDialog.Builder(LoginActivity.this).create(); 
     alertDialog.setMessage("服务器连接失败!请检查网络是否打开"); 
     alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

      } 
     }); 
     alertDialog.show(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return true; 
} 
+0

Vielen Dank – bowwwww

Antwort

0

Das Programm funktioniert nicht, weil zu der Zeit, dass Sie versuchen, die Steckdose zu öffnen mit:

socket.connect(new InetSocketAddress(IPAddr, 8866), 5000); 

der Dialog ist nach wie vor hoch und Wert von IPAddr wird noch nicht festgelegt wurde. Stellen Sie sicher, dass Sie erst dann eine Verbindung herstellen, wenn der Benutzer eine gültige Eingabe in das Feld eingegeben hat.

Achten Sie auch darauf, dass die oben genannte Methode den Thread blockiert, auf dem sie läuft, bis eine Verbindung hergestellt wird oder 5 Sekunden verstreichen, was bedeutet, dass es unklug wäre, sie direkt innerhalb der OnClickListener anzurufen. Sie sollten wahrscheinlich einen AsyncTask oder einen ähnlichen Code verwenden, um zu verhindern, dass der UI-Thread blockiert wird, während die Verbindung stattfindet.

+0

So großartig! Vielen Dank! – bowwwww

0

Sie sollten Ihre Verbindungscodes nach "onClick" bewegen.

new AlertDialog.Builder(this).setTitle("please input IP address") 
     .setIcon(android.R.drawable.ic_dialog_info).setView(et) 
     .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface arg0, int arg1) { 
       IPAddr = et.getText().toString(); 
       try { 
    Socket socket = new Socket(); 
    socket.connect(new InetSocketAddress(IPAddr, 8866), 5000); 
    OutputStream ou = socket.getOutputStream(); 
    ou.write((studentId+password).getBytes("UTF-8")); 
    ou.close(); 
    socket.close(); 
}catch (SocketTimeoutException aa) { 
    //连接超时 在UI界面显示消息 
    AlertDialog alertDialog = new AlertDialog.Builder(LoginActivity.this).create(); 
    alertDialog.setMessage("服务器连接失败!请检查网络是否打开"); 
    alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 

     } 
    }); 
    alertDialog.show(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
      } 
     }).setNegativeButton("cancel", null).show(); 
Verwandte Themen