2016-04-21 218 views
1

我想從一個Android應用程序向另一個Android應用程序發送一個字符串(以及後來的圖像)。我知道我非常接近。使用TCP通過套接字發送字符串

代碼「SendString」是一個手機上的一個Android應用程序。代碼「AppListener」在另一部手機上。 「SendString」似乎正常工作,併發送字符串,因爲我的所有打印語句正在打印。

「SendString」,這發出了一個字符串「的AppListener」:

(即我送「的applicationName」的字符串獲得通過,以「SendString」從項目的不同的活動)

我知道這段代碼正在工作,因爲我在「try」中獲得所有打印語句,並且它永遠不會傳遞給catch異常。

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; 
} 

} 

以下是正在偵聽端口連接的其他Android應用程序代碼,然後它應該從「SendString」接收字符串。

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; 
} 
} 

的問題是,它似乎被卡住在該行

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

,因爲我從來沒有得到print語句「這應該連接後打印」,但我得到的所有之前的打印語句那。有人看到問題是什麼,爲什麼我的AppListener活動似乎沒有連接到端口來接收字符串,即使我知道「SendString」應用程序正在連接併發送字符串,因爲它應該是(因爲我看到所有打印語句)。

+0

你應該先運行你的第二個代碼(它是你的服務器)。它會等待客戶。現在運行你的第一個代碼(它是你的客戶端) –

+0

@ScaryWombat,我更新了我的問題,以便更清楚。也許你可以看看。我嘗試通過運行第二個代碼「AppListener」進行測試,但我仍然面臨同樣的問題。 – Natalie

+0

我可以建議第二個android不在IP地址192.168.0.26上偵聽。 –

回答

0

有沒有人看到問題是什麼,爲什麼我的客戶端似乎沒有連接到端口來接收字符串,即使我知道服務器端正在連接併發送字符串,因爲它應該是。

  1. 你有'服務器'和'客戶端'混在一起。客戶端連接:服務器接受。
  2. 您描述爲客戶端的真實服務器不接受連接。
  3. 這隻能意味着您所描述的服務器的真實客戶端不會創建一個客戶端。

你必須要麼沒有執行你的真實客戶端,要麼你有沒有告訴我們ConnectException

+0

謝謝你澄清我的困惑!我更新了我的問題,希望更清楚(我希望)。所以,你說我的服務器「AppListener」不接受一個連接,我完全同意這個連接,因爲這是我的代碼似乎卡住了,並且不會再創建任何打印語句的地方。看起來我的客戶端正在建立連接,因爲我看到所有的打印語句,包括「應用程序名稱發送!」,並且它從不拋出異常。但是,它有可能沒有建立連接,即使它從不拋出異常? – Natalie

+1

它必須連接到別的東西。 – EJP

+0

所以我確實知道當「AppListener」連接到公共網絡時字符串正確傳遞。如果AppListener使用私有IP地址(以190開頭的地址開始的地址),則該字符串永遠不會發送到「AppListener」。你知道如何改變我的代碼,以便我可以將字符串發送到連接到專用Wifi網絡的設備嗎? – Natalie