我想制作一个小的Android游戏,其中一个人是主机(websocket服务器),而另一个人是客户端(websocket客户端)。
我正在使用TooTallNate's Java-WebSocket library作为客户端和服务器。
我有两部手机,一部使用websocket服务器,使用下一个uri创建:“ ws:// localhost:port”,另一部使用websocket客户端连接到“ ws:// my_public_ip:port”
我尝试了在互联网上找到的几个端口,以及与WIFI和3G,本地主机或我的公共IP的多种组合,所有这些都以连接被拒绝或超时结束。
我知道客户端正在工作,因为我能够连接到echo Websocket服务器。
这至少应该可以通过WIFI运作,并且通过3G也可以。
我应该在服务器和客户端使用哪些IP和端口?
我需要打开任何端口吗?
下面的代码是库的服务器和客户端实现,与我的项目的唯一区别是,我不是使用Java的main方法,而是在与主线程不同的线程中调用Android活动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连接:
我不明白为什么为本地主机而不是通过私有IP打开端口。 我需要对私有IP和公共IP开放,我缺少什么?
答案 0 :(得分:0)
ISP 是阻塞端口的那个。一旦我尝试了一个随机端口,它就会起作用。
在这种情况下可能有用的步骤: