java.net.ConnectException: 未能连接到 /192.168.253.3 (端口 2468): 连接失败: ECONNREFUSED (连接被拒绝)

2022-09-01 03:18:00

我想在PC和带有WiFi的手机之间传输一些数据。

以下是我获取WiFi IP地址的方式:

String ip  = String.format(
                    "%d.%d.%d.%d",
                    (wifiInfo.getIpAddress() & 0xff),
                    (wifiInfo.getIpAddress() >> 8 & 0xff),
                    (wifiInfo.getIpAddress() >> 16 & 0xff),
                    (wifiInfo.getIpAddress() >> 24 & 0xff));

new Recive().execute(ip);

这是有关向PC发送消息的代码:

Socket socket = null;
String message = "test\r\n";
protected Void doInBackground(String... urls) {
    try {
        Log.i("ip", urls[0]);
        socket = new Socket(urls[0], 2468);
        toserver = new DataOutputStream(socket.getOutputStream());
        toserver.writeBytes(message);

        toserver.flush();
        toserver.close();
        socket.close();
        return null;
    } catch (Exception e) {
        Log.i("e", e.toString());
        return null;
    }
}

但是发生了一个错误,

java.net.ConnectException: 未能连接到 /192.168.253.3 (端口 2468): 连接失败: ECONNREFUSED (连接被拒绝)

此外,我使用Android手机来运行该应用程序。


答案 1

最有可能意味着该端口和该 IP 地址上没有任何侦听。可能的解释包括:connect failed: ECONNREFUSED (Connection refused)

  • 服务已崩溃或尚未(成功!)启动,
  • 您的客户端正在尝试使用错误的 IP 地址或端口进行连接,
  • 您的客户端正在尝试使用解析为错误 IP 的 DNS 名称进行连接,或者
  • 服务器访问被防火墙阻止,防火墙代表服务器/服务“拒绝”。鉴于通常的做法(现在)是防火墙“黑洞”所有不需要的连接尝试,因此这不太可能

请注意,虽然您有一个名为 的数组变量,但它不能包含真正的 URL。没有采用任何形式的真实 URL 的构造函数的重载。实际上,如果您以字符串形式提供 URL,如下所示:urlsSocket

 new Socket("http://example.com", 42)

结果将是一个不同的例外。同样,如果您尝试连接到无法路由到的网络上的IP地址(例如“其他WiFi网络”),那么您将获得不同的例外;例如,“找不到主机”、“没有到主机的路由”或“没有到网络的路由”。


答案 2

在开发在开发计算机上的虚拟设备上运行的 Android 应用时,一个常见错误是忘记虚拟设备与开发计算机不是同一主机。因此,如果您的服务器在开发计算机上运行,则无法使用“http://localhost/...”url,因为这将在虚拟设备上查找服务器终结点,而不是在开发计算机上查找。


推荐