繁体   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