我使用下面的代码连接到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)
任何人都知道我为什么要面对这个问题?
答案 0 :(得分:1)
如果ip_str
是完整的网址,例如"wss://xyz.com:8181/game"
,则以下行完全错误:
serverAddr = InetAddress.getByName(ip_str);
您无法将网址传递给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();
...
或者,使用实际的第三方WebSocket库(其中有许多可用于Android)。
答案 1 :(得分:-1)
这是因为您尝试通过安全/加密连接wss://
进行连接。在应用程序连接到目标地址之前,您需要额外的步骤。通常首先设置证书。
您可以查看此解决方案: Unable to connect websocket with wss in android。更多信息: how to create Socket connection in Android?