插座连接:ECONNREFUSED

时间:2017-09-06 12:06:56

标签: android sockets

我使用下面的代码连接到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)

任何人都知道我为什么要面对这个问题?

2 个答案:

答案 0 :(得分:1)

如果ip_str是完整的网址,例如"wss://xyz.com:8181/game",则以下行完全错误:

serverAddr = InetAddress.getByName(ip_str);

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

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

因此,使用URIURL类将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();
...

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

答案 1 :(得分:-1)

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

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