簡體   English   中英

從 Java EE 向 Android 發送數據

[英]Send data to Android from Java EE

我正在嘗試通過 TCP/IP 將數據從 Java EE 應用程序發送到 Android 應用程序。 在 Android 中,我在 AsyncTask 中有以下內容:

try {
    ServerSocket serverSocket = new ServerSocket(48760);

    while (true) {
        Socket socket = serverSocket.accept();
        // Do something interesting with sent data
    }
} catch (IOException e) {
    e.printStackTrace();
}

我已驗證該應用程序一直執行,直到它按預期阻塞在 accept() 調用處。

在服務器端(Java EE)我使用:

// address contains the IP of the android device as a string.
InetAddress addr = InetAddress.getByName(address); 
Socket conn = new Socket(addr, 48760);

在這里,當應用程序到達“new Socket()”時,我得到“java.net.ConnectException: Connection timed out: connect”。 關於為什么會這樣的任何想法?

我的清單中有。 而且“地址”中的 ip 似乎是正確的(我的服務提供商提供的 ip)。

有沒有更好的發送消息的方式? 我計划使用 Serializable 對象(從 Android 到 JavaEE,我使用 HTTP,通過 Servlet),但我願意接受建議。

好的,你的工具有問題!

為什么你需要從服務器連接到客戶端(誰在乎,但客戶端現在是服務器!)!?

你必須解決這個問題!

讓我們告訴你你的問題是什么!

如果您的服務器(JAVA EE 服務器)在公共互聯網上,則意味着您的服務器具有公共 IP地址。 公共 IP地址可從連接到 Internet 的所有設備訪問! 您可以控制服務器的所有端口等等......,這樣每個人都可以在公共互聯網上連接到您的網絡應用程序。

但是在客戶端有些不同! 當您在客戶端連接到互聯網時,會發生這種情況:

  • 1 - 您的設備連接到路由器(它可以是您家中的調制解調器或移動服務)
  • 2 - 您的路由器在IPS網絡和ISP網絡中有一個IP 地址(使用NAT )將其轉換為可能的公共 IP
  • 3 - 現在您的設備具有與分配給ISP 中路由器的IP相同的IP

您的問題在第 2 部分 因為大多數ISP (s) 在客戶端之間共享一個公共 IP ,所以這意味着當您分配的IPADDR_1 時,有另一個客戶端具有相同的IP ADDR_1並且您無法控制其上的所有端口。 也許當您在本地網絡中偵聽端口 8080 時, ISP 會為您的公共 IP分配另一個端口(無論NAT會在大多數ISP 中阻止您的偵聽端口)

因此,每個客戶端都沒有唯一的 IP,並且在公共互聯網中很難找到它們(當 ISP 上存在新的NAT [Symmetric-NAT]時會更難)

有幾種方法可以解決這個問題,但沒有任何方法可以 100% 工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM