Websocket 服务器连接被拒绝
Websocket server connection refused
我想做一个Android小游戏,其中一个人是主机(websocket服务器),同一个人和其他人是客户端(websocket客户端)。
我正在为客户端和服务器使用 TooTallNate's Java-WebSocket library。
我有两部手机,一部带有 websocket 服务器,使用下一个 uri 创建:"ws://localhost:port",另一部带有连接到 "ws://my_public_ip:port"
的 websocket 客户端
我尝试了在互联网上找到的几个端口以及 WIFI 和 3G、本地主机或我的 public IP 的多种组合,但都以 连接被拒绝或超时.
我知道客户端正在工作,因为我能够连接到 echo websocket 服务器。
这至少应该通过 WIFI 工作,通过 3G 也很好。
服务器端和客户端应该使用什么IP和端口?
我需要打开任何端口吗?
下面的代码是库的服务器和客户端实现,与我的项目的唯一区别是我在 [=91] 中调用相同的行而不是 java 的主要方法=] 的 activity onCreate 方法在不同于主线程的线程中。
库的服务器端实现:
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
public class SimpleServer extends WebSocketServer {
public SimpleServer(InetSocketAddress address) {
super(address);
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
conn.send("Welcome to the server!"); //This method sends a message to the new client
broadcast( "new connection: " + handshake.getResourceDescriptor() ); //This method sends a message to all clients connected
System.out.println("new connection to " + conn.getRemoteSocketAddress());
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
System.out.println("closed " + conn.getRemoteSocketAddress() + " with exit code " + code + " additional info: " + reason);
}
@Override
public void onMessage(WebSocket conn, String message) {
System.out.println("received message from " + conn.getRemoteSocketAddress() + ": " + message);
}
@Override
public void onMessage( WebSocket conn, ByteBuffer message ) {
System.out.println("received ByteBuffer from " + conn.getRemoteSocketAddress());
}
@Override
public void onError(WebSocket conn, Exception ex) {
System.err.println("an error occured on connection " + conn.getRemoteSocketAddress() + ":" + ex);
}
@Override
public void onStart() {
System.out.println("server started successfully");
}
public static void main(String[] args) {
String host = "localhost";
int port = 8887;
WebSocketServer server = new SimpleServer(new InetSocketAddress(host, port));
server.run();
}
}
库的客户端实现:
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.drafts.Draft_6455;
import org.java_websocket.handshake.ServerHandshake;
public class EmptyClient extends WebSocketClient {
public EmptyClient(URI serverUri, Draft draft) {
super(serverUri, draft);
}
public EmptyClient(URI serverURI) {
super(serverURI);
}
@Override
public void onOpen(ServerHandshake handshakedata) {
send("Hello, it is me. Mario :)");
System.out.println("new connection opened");
}
@Override
public void onClose(int code, String reason, boolean remote) {
System.out.println("closed with exit code " + code + " additional info: " + reason);
}
@Override
public void onMessage(String message) {
System.out.println("received message: " + message);
}
@Override
public void onMessage(ByteBuffer message) {
System.out.println("received ByteBuffer");
}
@Override
public void onError(Exception ex) {
System.err.println("an error occurred:" + ex);
}
public static void main(String[] args) throws URISyntaxException {
WebSocketClient client = new EmptyClient(new URI("ws://localhost:8887"));
client.connect();
}
}
编辑 25/08/2019
我在 android 设备上安装了 Port Scanner 并且可以检查端口是否打开,这些是我遵循的步骤,全部通过 WIFI 连接:
- 安装端口扫描器
- 检查 127.0.0.1 (localhost) 和端口 8080,结果:0 个端口打开
- 运行 带有 websocket 服务器的应用程序并启动它。
- 检查 127.0.0.1 (localhost) 和端口 8080,结果:端口 8080 OPEN: Alternate HTTP (我不知道你必须启动服务器才能打开端口,我认为路由器的端口转发配置应该足够了,我错了)
- 检查192.168.1.X(我的私有静态本地IP为同一个设备,有服务器的那个)和端口8080。结果:0 个端口打开。
我不明白为什么端口是给本地主机开放的,而不是通过私有IP。
我需要它对私人 IP 和 public IP 开放,我错过了什么?
ISP 封锁端口。一旦我尝试了一个随机端口,它就起作用了。
在这种情况下可能有用的步骤:
- 在服务器的设备上使用 WIFI。
- 在您的服务器设备中使用静态 IP,而不是 DHCP 提供的 IP。
- 转到路由器的端口转发部分 打开 端口 你的服务器将是 运行。你需要把你的服务器设备私有IP。
- 运行服务器(重要的遗漏步骤)。
- 使用任何 tool/web 或应用程序检查您的端口是否使用您的 public IP.
打开
- 如果 none 可行,请尝试禁用您的 O.S.'s 和 路由器的防火墙 ,一旦你得到答案,再次启用它们,如果它是阻止你端口的防火墙之一,在防火墙中为该端口创建一个规则。
- 如果 none 有效,您的 ISP 可能阻止了它们,搜索 google 有关您的 ISP 阻止端口的信息。
我想做一个Android小游戏,其中一个人是主机(websocket服务器),同一个人和其他人是客户端(websocket客户端)。
我正在为客户端和服务器使用 TooTallNate's Java-WebSocket library。
我有两部手机,一部带有 websocket 服务器,使用下一个 uri 创建:"ws://localhost:port",另一部带有连接到 "ws://my_public_ip:port"
的 websocket 客户端我尝试了在互联网上找到的几个端口以及 WIFI 和 3G、本地主机或我的 public IP 的多种组合,但都以 连接被拒绝或超时.
我知道客户端正在工作,因为我能够连接到 echo websocket 服务器。
这至少应该通过 WIFI 工作,通过 3G 也很好。
服务器端和客户端应该使用什么IP和端口?
我需要打开任何端口吗?
下面的代码是库的服务器和客户端实现,与我的项目的唯一区别是我在 [=91] 中调用相同的行而不是 java 的主要方法=] 的 activity onCreate 方法在不同于主线程的线程中。
库的服务器端实现:
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
public class SimpleServer extends WebSocketServer {
public SimpleServer(InetSocketAddress address) {
super(address);
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
conn.send("Welcome to the server!"); //This method sends a message to the new client
broadcast( "new connection: " + handshake.getResourceDescriptor() ); //This method sends a message to all clients connected
System.out.println("new connection to " + conn.getRemoteSocketAddress());
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
System.out.println("closed " + conn.getRemoteSocketAddress() + " with exit code " + code + " additional info: " + reason);
}
@Override
public void onMessage(WebSocket conn, String message) {
System.out.println("received message from " + conn.getRemoteSocketAddress() + ": " + message);
}
@Override
public void onMessage( WebSocket conn, ByteBuffer message ) {
System.out.println("received ByteBuffer from " + conn.getRemoteSocketAddress());
}
@Override
public void onError(WebSocket conn, Exception ex) {
System.err.println("an error occured on connection " + conn.getRemoteSocketAddress() + ":" + ex);
}
@Override
public void onStart() {
System.out.println("server started successfully");
}
public static void main(String[] args) {
String host = "localhost";
int port = 8887;
WebSocketServer server = new SimpleServer(new InetSocketAddress(host, port));
server.run();
}
}
库的客户端实现:
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.drafts.Draft_6455;
import org.java_websocket.handshake.ServerHandshake;
public class EmptyClient extends WebSocketClient {
public EmptyClient(URI serverUri, Draft draft) {
super(serverUri, draft);
}
public EmptyClient(URI serverURI) {
super(serverURI);
}
@Override
public void onOpen(ServerHandshake handshakedata) {
send("Hello, it is me. Mario :)");
System.out.println("new connection opened");
}
@Override
public void onClose(int code, String reason, boolean remote) {
System.out.println("closed with exit code " + code + " additional info: " + reason);
}
@Override
public void onMessage(String message) {
System.out.println("received message: " + message);
}
@Override
public void onMessage(ByteBuffer message) {
System.out.println("received ByteBuffer");
}
@Override
public void onError(Exception ex) {
System.err.println("an error occurred:" + ex);
}
public static void main(String[] args) throws URISyntaxException {
WebSocketClient client = new EmptyClient(new URI("ws://localhost:8887"));
client.connect();
}
}
编辑 25/08/2019
我在 android 设备上安装了 Port Scanner 并且可以检查端口是否打开,这些是我遵循的步骤,全部通过 WIFI 连接:
- 安装端口扫描器
- 检查 127.0.0.1 (localhost) 和端口 8080,结果:0 个端口打开
- 运行 带有 websocket 服务器的应用程序并启动它。
- 检查 127.0.0.1 (localhost) 和端口 8080,结果:端口 8080 OPEN: Alternate HTTP (我不知道你必须启动服务器才能打开端口,我认为路由器的端口转发配置应该足够了,我错了)
- 检查192.168.1.X(我的私有静态本地IP为同一个设备,有服务器的那个)和端口8080。结果:0 个端口打开。
我不明白为什么端口是给本地主机开放的,而不是通过私有IP。 我需要它对私人 IP 和 public IP 开放,我错过了什么?
ISP 封锁端口。一旦我尝试了一个随机端口,它就起作用了。
在这种情况下可能有用的步骤:
- 在服务器的设备上使用 WIFI。
- 在您的服务器设备中使用静态 IP,而不是 DHCP 提供的 IP。
- 转到路由器的端口转发部分 打开 端口 你的服务器将是 运行。你需要把你的服务器设备私有IP。
- 运行服务器(重要的遗漏步骤)。
- 使用任何 tool/web 或应用程序检查您的端口是否使用您的 public IP. 打开
- 如果 none 可行,请尝试禁用您的 O.S.'s 和 路由器的防火墙 ,一旦你得到答案,再次启用它们,如果它是阻止你端口的防火墙之一,在防火墙中为该端口创建一个规则。
- 如果 none 有效,您的 ISP 可能阻止了它们,搜索 google 有关您的 ISP 阻止端口的信息。