2016-07-22 7 views
1

Ich versuche, eine Android-App, wo zwei Telefone in der Lage sein, Textnachrichten ohne eine Daten- oder Mobilfunkverbindung, aber stattdessen über eine WiFi-Verbindung miteinander zu senden. Ich fand heraus here, dass ich zuerst eine P2P (Wifidirect) Verbindung machen muss und dann versuche, einen Server-Socket zu verwenden, um auf einen Client zu warten, um Daten zu verbinden und zu senden. Jetzt kann ich die P2P-Verbindung herstellen, aber ich kann keinen Socket verwenden, um die Daten zu übertragen. Ich bekomme ein Null-Ergebnis in meiner onPostExecute() Methode auf der Client- und Server-Seite. Wie sollte ich den Server und den Client einrichten?kann nicht mit Server-Socket verbinden, um Daten in Android zu übertragen

Ich habe ein Objekt jeder Klasse in meiner MainActivity gemacht, um die Client- und Server-Seite zu starten. Beide werden im Hintergrund ausgeführt.

Client task = new Client(MainActivity.this,d.deviceAddress); 
task.execute(); 

sever task = new server(MainActivity.this); 
       task.execute(); 

Hier ist meine Server-Seite:

public class server extends AsyncTask<String, String, String>{ 

    InputStream inputstream ; 
    Socket client; 
    ByteArrayOutputStream result; 
    byte[] buffer; 
    private Context context; 
    public static InetAddress address; 
    public static boolean connected; 

    public server(Context context) { 
     this.context = context; 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     ServerSocket serverSocket; 

     //byte[] ipAddress={'5','4','3','1'}; 

     try { 

       address = InetAddress.getByName("hazel");// i tried to use getByAddress(ipAddress) as well ,no change 
       serverSocket = new ServerSocket(8888,10,address); 
       // serverSocket.setSoTimeout(10000); 
       client = serverSocket.accept(); 
       connected =true; 


      } catch (IOException e) { 
       return null; 
      } 
     return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

      if (result != null) { 
       super.onPostExecute(result); 
       Toast.makeText(context, "result is "+result,Toast.LENGTH_LONG).show(); 
       } 
       Toast.makeText(context, " is someone connected "+ connected ,Toast.LENGTH_LONG).show(); 
     } 

} 

Hier ist der Client-Seite:

public class Client extends AsyncTask<String, String, String> { 

    Context ctx; 
    String deviceAddress ; 
    String sek; 
    boolean isresolved = false; 
    InetAddress inetaddress; 


     Client task = new Client(MainActivity.this,d.deviceAddress); 
     task.execute(); 
    public Client(MainActivity ctx, String deviceAddress) { 

     this.ctx = ctx; 
     this.deviceAddress = deviceAddress; 

    } 


    @Override 
    protected String doInBackground(String... arg0) { 

       String host="hazel"; 
       int port=8888; 

       int len; 
       Socket socket = new Socket(); 
       byte buf[] = new byte[1024]; 

       try { 

         socket.bind(null); 

        // byte[] ipAddress={'5','4','3','1'}; 

        inetaddress = InetAddress.getByName("hazel"); 
        InetSocketAddress address = new InetSocketAddress(inetaddress,8888); 


        isresolved = address.isUnresolved(); 
        // the isresolved will get false value after executing the code 
        // i think it means that adress has no problem 


        socket.connect(address,1000); 



       } catch (SecurityException e) { 
        Log.v("Exception" , "is " + e); 

       } catch (Exception e) { 
        Log.v("Exception" , "is " + e); 

       } 

       finally { 
        if (socket != null) { 
         if (socket.isConnected()) { 
          try { 
           socket.close(); 
          } catch (IOException e) { 

           Log.v("Exception " , "is " + e); 
          } 
         } 
        } 
       }  

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     if (result != null) {    
      super.onPostExecute(result); 
      Toast.makeText(ctx, "clientside , result : "+result ,Toast.LENGTH_LONG).show(); 
      }else Toast.makeText(ctx, "result is null :(" , result : "+result ,Toast.LENGTH_LONG).show(); 
    } 

} 

Wenn ich die Server-Seite laufen die onPostExecute wird mit dem Null-Ergebnis aufgerufen werden. Ich erwarte, dass onPostExecute aufgerufen wird, nachdem jemand mit dem Server verbunden ist.

Auf der Client-Seite bekomme ich ein Null-Ergebnis auf onPostExecute Methode und ist auch nicht gelöst Methode gibt false zurück.

Ich muss zuerst eine Verbindung zum Server herstellen, um Daten zu senden. Kann irgendjemand darauf hinweisen, was mit meiner Logik nicht stimmt? Ich habe versucht, den Socket auf verschiedene Arten zu erstellen (wie Port, Port mit Hostname, Port mit IP-Adresse) und setzen serverSocket.accept(), aber es hat nicht so gut funktioniert.

Antwort

0

gut ist es so traurig, dass ich meine Frage beantworten muss, aber in P2P-Verbindung ist die IP immer konstant. sein "192.168.49.1". Also habe ich gerade einen Sockel wie unten erstellt

clientSocket = neuer Socket ("192.168.49.1", 9889);

Es ist egal, ob Sie Ihren Code in doInBackgroundmethod oder einem neuen Thread ausführen, aber die Ports müssen gleich sein

0
  1. doInBackground kehrt nie etwas anderes als null, so onPostExecute nichts anderes sieht
  2. Wenn Sie die Server wollen für Verbindungen kontinuierlich laufen und zu hören, müssen Sie ein Thema/Dienst unendlich laufen und Verbindungen annehmen. Ein AsyncTask soll kurzlebige Aufgaben ausführen.
  3. Sie könnten zum Beispiel in mehr reaktive Programmierung mit Rückrufen für eine onClientConnect() Methode suchen.