4

我使用 Sockets 用 Ja​​va 制作了一个网络游戏。它工作得很好,除了......只能通过我的局域网。:/ 我想要做的是设置它,以便我可以启动在我的家用计算机上运行的服务器并将客户端代码以可执行 jar 的形式发送给其他人,并让他们能够启动它并通过互联网连接。但就像......我不知道如何为此设置我的调制解调器和路由器。:( 我有一个无线 Clear 调制解调器,其配置页面如下所示:

http://imageshack.us/photo/my-images/254/mo​​dem.jpg

还有一个 Netgear 路由器,其页面如下所示:

http://imageshack.us/photo/my-images/443/routerq.jpg

现在,在客户端和服务器运行器类中,我将我的 PC 的私有 IP 地址以及我选择的端口号传递给 ServerSocket 和 Socket 对象。我听说套接字既可以是 UDP 也可以是 TCP,这取决于您如何设置它们,或者……?不过,我不做任何类似的事情,我只是实例化它们并将它们传递给 2 个值,然后它们就走了......

在服务器的代码中:

ServerSocket sock = new ServerSocket();
sock.bind(new InetSocketAddress(IP, 9001));

客户端代码:

Socket sock = new Socket(IP, 9001);

因此,我还需要知道如何根据路由器/调制解调器设置的更改相应地更改代码。

“IP”是一个字符串,表示我的计算机的私有 IP 192.168.1.10,并且该程序仅在我传递给 Socket 和 ServerSocket 的字符串时才有效。就像我说的,我有一个调制解调器,它连接到一个连接到我的计算机的路由器。那么,有人可以向我解释一下(详细说明,因为我是菜鸟)我究竟需要做什么来配置它们,以及我必须对我的代码进行哪些更改?

4

2 回答 2

2

您必须手动进行端口转发,或者查看像 UPnP 或 NAT-PMP 这样的解决方案来进行自动端口转发。不幸的是,NAT 配置起来很麻烦,而且大多数路由器都不能正确支持它。这也不是一项简单的任务,因为您必须支持一系列不同的实现和机制。

不过,将路由器设置为将一个端口转发到您的机器应该不会太难。有关如何在几乎任何路由器上执行此操作的精彩列表,请参见http://portforward.com/ 。

于 2011-11-17T13:05:02.743 回答
0

听起来你在这里问了很多问题......我不是网络/套接字编程专家,但这里有一些想法。

对于分发,您可能希望查看Java Web Start。它将使您的客户轻松获取应用程序以及自动更新。

如果您使用这样的Socket构造函数,则实际实现将是系统默认值。您可以通过使用合适的实现调用此方法来覆盖它。SocketImplFactory

至于 IP 地址和端口... 使用硬编码的端口值应该没问题。您需要决定客户端连接的端口或至少一些默认值。即便如此,从一些外部配置文件中读取值可能会很有用。如果您决定分发服务器应用程序以让其他人运行服务器,这将使您更容易。他们可能想使用不同的端口。

但是,将服务器的 IP 地址(您的)硬编码在代码中绝对是一个禁忌。客户端应使用他们需要提供或在某些配置文件中设置的 IP 地址或主机名进行连接。如果您没有静态 IP 地址,则需要主机名。

除非这是你和一些朋友喜欢的东西,你总是可以通过在聊天会话中提供 IP 和端口或其他东西来启动游戏,你最好在一家公司找到一些外部托管解决方案来照顾为您提供 DNS 解析和网络设置。如今,如果您没有 Java EE 服务器或数据库之类的要求,您会发现这样的东西非常便宜。

编辑:想到别的东西。TCP 可能适合您的用例,但如果这是一款需要最小延迟和快速输入同步的游戏(如射击游戏或格斗游戏),那么它不是最佳选择。在那种情况下,UDP会更好。这将导致需要添加某种异步检测或弥补任何丢弃数据包的机制。

于 2011-11-17T13:22:00.400 回答