【问题标题】:Socket connecting : ECONNREFUSED套接字连接:ECONNREFUSED
【发布时间】:2017-09-07 08:23:53
【问题描述】:

我使用下面的代码连接到一个 php websocket。

serverAddr = InetAddress.getByName(ip_str);
                socket = new Socket(serverAddr, port_str);
                mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));

试图打开一个套接字并想监听来自服务器的数据。

ip_str 是这样的:wss://xyz.com:8181/game 其中 xyz 是实际主机名,8181 是虚拟端口号(已给出虚拟值,因为我无法在此处给出实际值 -但它在网络上工作正常,因为我们试图通过网络连接相同的套接字)。

在这一行:

socket = new Socket(serverAddr, port_str);

我收到以下错误消息:

java.net.ConnectException: failed to connect to ip6-localhost/::1 (port 8181): connect failed: ECONNREFUSED (Connection refused)

有人知道我为什么会遇到这个问题吗?

【问题讨论】:

  • 在您尝试连接的 IP:port 上没有任何东西在监听。
  • 不明白,因为我是套接字新手。它在网络上运行良好。
  • 看起来port 为零。这不可能是正确的。
  • 但是错误信息中明确写着(port 0)。
  • 除了错误地称为port_str 的变量的名称 之外,您没有显示任何内容。它不是一个字符串,您还没有显示它的值是 8181,或者实际上是任何非零值。错误消息与您不符。

标签: android sockets


【解决方案1】:

如果ip_str 是像"wss://xyz.com:8181/game" 这样的完整网址,那么下面这行是完全错误的:

serverAddr = InetAddress.getByName(ip_str);

您不能将 URL 传递给 InetAddress.getByName()。它只接受带点的 IP 地址或主机名作为输入,例如:

serverAddr = InetAddress.getByName("xyz.com");

所以,使用URI或URL类将URL解析成其组成部分,然后您可以将主机名部分解析为IP地址,例如:

URI WebSocketUri = new URI("wss://xyz.com:8181/game"); // or URL
serverAddr = InetAddress.getByName(WebSocketUri.getHost());
...

或者,您可以让Socket为您解析主机:

URI WebSocketUri = new URI("wss://xyz.com:8181/game"); // or URL
if (WebSocket.getScheme() == "wss")
    socket = new SSLSocket(WebSocket.getHost(), WebSocket.getPort());
else
    socket = new Socket(WebSocket.getHost(), WebSocket.getPort());
// send an HTTP request for WebSocket.getRawPath() and negotiate WebSocket handshake as needed...

或者更好的是,改用URLConnection:

WebSocketUri = new URL("wss://xyz.com:8181/game");
URLConnection conn = WebSocketUri.openConnection();
...

或者,使用实际的 3rd 方 WebSocket 库(其中有许多可用于 Android)。

【讨论】:

  • 现在工作正常,谢谢。但后来我面临一个问题,服务器没有收到我的请求。它在服务器上显示错误
  • @ParthAnjaria 这与您在此处询问的问题不同。请发布一个新问题,并确保显示您的最新代码。
【解决方案2】:

这是因为您尝试通过安全/加密连接wss:// 进行连接。在您的应用程序可以连接到目标地址之前,您需要额外的步骤。通常是先设置证书。

您可以检查此解决方案: Unable to connect websocket with wss in android。更多信息在这里: how to create Socket connection in Android?

【讨论】:

  • 在这种情况下,连接(TCP 连接)仍然会成功,它需要额外的步骤来实现完整的 websocket 连接。换句话说,错误消息不会是 ECONNREFUSED
猜你喜欢
  • 2017-07-15
  • 1970-01-01
  • 2011-08-11
  • 2020-10-27
  • 2016-08-19
  • 2018-07-10
  • 2016-10-01
  • 2013-08-22
  • 1970-01-01
相关资源
最近更新 更多