我最近用 java 开发了相当多的多人游戏(基于棋盘/回合的游戏,在带有数据输入/输出流的 tcp 连接上运行),但它们只能在本地运行,我想更进一步,让它们在线运行,我需要更改什么才能使其运行?
似乎有很多方法可以实现这一目标,但我不知道从哪里开始,因为我对网络了解不多。
此外,我没有真正的服务器,我只使用我的家庭路由器和我的电脑。
这是我迄今为止尝试过的:
- 我在路由器中启用了端口转发,我认为它有效(我在线使用了端口转发检查工具)
- 我使用 noip.com 为我的公共(public) IP 创建了动态 DNS
所以服务器端至少应该没问题,我的问题是客户端,客户端的套接字无法连接到我的公共(public)IP,当我搜索解决方案时,我得出的结论是客户端不应该与服务器位于同一个局域网中,所以我使用移动热点作为第二个网络并再次尝试,但得到了相同的结果。 (连接拒绝异常)是因为移动热点(我应该使用另一个路由器)吗?或者只是一些编码调整?
这是一个最小的服务器类示例
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(50895);
Socket cs = ss.accept();
DataOutputStream out = new DataOutputStream(cs.getOutputStream());
DataInputStream in = new DataInputStream(cs.getInputStream());
out.writeInt(123456);
} catch (IOException e) {
e.printStackTrace();
}
}
这是一个最小的客户端类示例
public static void main(String[] args) {
try {
String ip = Inet4Address.getByName("my Dynamic IP address").getCanonicalHostName();
System.out.println(ip);
InetSocketAddress sa = new InetSocketAddress(ip, 50895);
Socket cs = new Socket();
cs.connect(sa);
DataOutputStream out = new DataOutputStream(cs.getOutputStream());
DataInputStream in = new DataInputStream(cs.getInputStream());
System.out.println("received : " + in.readInt());
} catch (IOException e) {
e.printStackTrace();
}
}
我尝试过的方法总是给我一个连接拒绝异常,因此任何解决方案将不胜感激。
我通过虚拟局域网(使用 LogMeIn Hamachi)找到了解决该问题的软件,该软件主要用于创建游戏服务器,您只需要创建一个帐户和一个网络,以便您的 friend 可以加入它,之后一切都应该很好,并且可以像本地托管一样运行。
您可以通过here下载该软件但是有很多替代方案可供选择,其中一个可以免费为您提供最多 5 个人的网络连接,这不是最好的,但仍然是一个免费的解决方案。
我仍然想要更多不需要第三方软件的 java 解决方案来解决这个问题。
我是一名优秀的程序员,十分优秀!