2016-04-22 3 views
0

Ich versuche, eine Zeichenfolge (und später auch ein Bild) von einer Android App an eine andere Android App zu senden, wenn jede App auf einem ist anderes Gerät und das Empfangsgerät ist auf einem privaten Wifi-Netzwerk. (Der Server wartet auf eine private IP: 192.xx.xx.xx). Dieser Code funktioniert, wenn der Server mit einer öffentlichen IP verbunden ist, aber nicht privat, wie ich möchte.Senden einer Zeichenfolge zwischen zwei Geräten über einen Socket mithilfe von TCP, wenn Server in einem privaten Netzwerk ist

Der Code "SendString" ist eine Android-App auf einem Telefon. Und der Code "AppListener" ist auf dem anderen Telefon (das ist der Server). Ich kann die Zeichenfolge von SendString an AppListener senden, wenn AppListener mit einer öffentlichen Wifi-IP-Adresse verbunden ist.

„Sendstring“, die eine Zeichenfolge „AppListener“ sendet:

(die Zeichenfolge, die ich „application“ sende geleitet wird immer auf „Sendstring“ aus einer anderen Aktivität im Projekt)

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

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

    Log.d("tag_name", "Entered AsyncTask"); 

    String applicationName = params[0]; 


    // SEND APPLICATION NAME AND ICON TO OTHER APP 

    try { 

     Log.d("tag_name", "TRY TO SEND STRING"); 
     Socket socket = new Socket("192.168.0.26", 1755); 
     DataOutputStream DOS = new DataOutputStream(socket.getOutputStream()); 
     DOS.writeUTF(applicationName); 
     Log.d("tag_name", "Application Name Sent!"); 
     socket.close(); 

    } 

    catch (Exception e){ 

     Log.d("tag_name", "Did not send string"); 

    } 

    return null; 
} 

} 

der „Sendstring“ Code wird an der print-Anweisung stecken zu bleiben „Try String senden“, und es ist auf die IP des anderen Telefons einer Verbindung direkt nach dieser Print-Anweisung nicht in der Lage.

Hier ist der andere Android-App-Code (auf dem Server), der auf eine Portverbindung wartet, und dann sollte er die Zeichenfolge von "SendString" erhalten.

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



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

    String msg_received = null; 

    System.out.println("LISTENING FOR LAST INSTALLED APP"); 

    try { 


     System.out.println("TRY"); 
     ServerSocket socket = new ServerSocket(1755); 
     System.out.println("Connect to Socket and listening"); 
     Socket clientSocket = socket.accept();  //This is blocking. It will wait. 
     System.out.println("This should print after connection"); 
     DataInputStream DIS = new DataInputStream(clientSocket.getInputStream()); 
     msg_received = DIS.readUTF(); 

     System.out.println("Message from server" + msg_received); 

     clientSocket.close(); 
     socket.close(); 
    } catch (Exception e) { 
     System.out.println("Did not connect to SendString"); 
    } 
    System.out.println("Return Statement is Reached"); 
    return msg_received; 
} 
} 

Das Problem ist, dass es scheint, an der Linie

Socket clientSocket = socket.accept();  //This is blocking. It will wait. 

Hat jemand geklebt wird immer wissen, wie diese Verbindung Arbeit machen, wenn mein Server mit einem privaten Netzwerk verbunden ist?

+1

Wenn sich die Geräte nicht im selben Netzwerk befinden, ist es nicht möglich, über eine lokale IP zu kommunizieren (d. H. 192.168 ....) – pay

+0

Haben Sie versucht, die INetAddress festzulegen, anstatt auf den Standard zurückzufallen? Siehe: http://developer.android.com/reference/java/net/ServerSocket.html#ServerSocket%28int,%20int,%20java.net.InetAddress%29. – jgitter

Antwort

0

In dieser Codezeile:

Socket socket = new Socket("192.168.0.26", 1755); 

Sie sollten die private IP-192.168.0.26 für eine öffentliche IP zu ersetzen, können Sie die öffentliche IP in einem von mehreren Netzwerkdienste wie this

Sie Eingabe finden

Auch Sie müssen überprüfen, ob der 1755-Port für eingehende TCP-Verbindungen in Ihrer Firewall oder in Ihrer Routerkonfiguration offen ist.

Hoffe es hepls.

Verwandte Themen