4

您好,我正在制作 Java 多人游戏,一切正常。它拥有人们需要的一切,但我发现了一个问题,它使用 ServerSocket 作为服务器,使用 Socket 作为客户端,工作正常,但最大的问题是它不能在全球范围内工作。只有局域网,我什至尝试过 Hamachi,但也没有用。

你有什么想法会起作用吗?

更多信息:我使用服务器中的特定线程来接受、发送和接收套接字,并使用客户端中的特定线程来发送和接收。它发送一个我制作并包含所有信息的对象。

ip = InetAddress.getLocalHost().getHostAddress() + ":" + port;

server = new ServerSocket();

//This asks you if you want to use a specific IP or just the one that we got in first line
String socketaddress;
socketaddress = (String) JOptionPane.showInputDialog(null, "IP: ", "Info",JOptionPane.INFORMATION_MESSAGE,null,null,InetAddress.getLocalHost().getHostAddress());
server.bind(new InetSocketAddress(socketaddress, port));

//Here it starts the accept thread, and then it starts send and receive threads
new Thread(accept).start();

以下是我认为最重要的客户资料:

socket = new Socket(ip,port);

String set_username = System.getProperty("user.name");
set_username = (String) JOptionPane.showInputDialog(null, "Username: ", "Info", JOptionPane.INFORMATION_MESSAGE,null,null,set_username);
username = set_username;

//It sends the username to server
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(username);

//Then server responds with a message
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String response = (String) ois.readObject();

//This writes the server' message   
JOptionPane.showMessageDialog(null, response, "Message",JOptionPane.INFORMATION_MESSAGE);

另外我还有另一个问题,套接字从一个客户端到另一个客户端需要 3 或 4 秒,它应该几乎是即时的,因为它在同一个网络上,而且我有一个快速的互联网。

编辑:我尝试使用客户端在同一台电脑上创建服务器,然后在使用我的全球 IP 加入时,它不起作用:(

编辑:它的工作我很高兴现在我所要做的就是在防火墙中添加端口,非常感谢你们:D。现在我可以和我的朋友一起玩了:3

4

3 回答 3

7

当您连接到 Internet 上的 Java Web 服务器时,它将使用 ServerSocket 和 Socket。这工作得很好。

可能不起作用的是 Internet 上的用户无法连接到您,因为您位于防火墙或路由器/NAT 后面(与 Java 无关)。在 Internet 上的用户可以通过 IP 地址远程登录到您机器上的端口之前,使用 Java 不会使这项工作有任何不同。

顺便说一句:在创建 ObjectInputStream 之前,您应该始终创建 ObjectOutputStream AND flush() ,否则另一端的 ObjectInputStream 可能会永远阻塞。

于 2012-04-10T18:39:42.707 回答
5

您需要阅读防火墙(控制允许从 LAN 外部连接到机器的设备)、端口转发(可以将公共 IP 地址转发到内部 IP 地址)和一般IP 寻址(这会给您一些有关 IP 地址如何工作、什么是公共/私有以及数据如何跨网络传输的信息)。

从那里开始,如果在以后的问题中,您将发布您正在连接IP 地址和连接的 IP 地址(公共或其他)、正在发生的错误消息(不仅仅是代码)以及您的内容,这将非常有帮助。我已经尝试过但失败了。stackoverflow 上的 Q/A 并不意味着是故障排除会话——我们确实需要特定的错误消息、端口转发的配置方式、防火墙的配置等,以及您尝试过的事情。目前,鉴于您发布的代码,全球游戏存在许多潜在问题(尽管代码实际上可能不是问题 - 它可能更多是配置问题)。

我基本上是说虽然这是一个非常广泛的答案,但是您的问题也非常广泛,并且不涉及明确的问题。

于 2012-04-10T18:41:37.300 回答
0

您需要来自 ISP 的静态 IP 地址,并且需要转发路由器中的端口以指向您正在使用的服务器的 LAN IP。192.168.1.xxx 注意:一些 ISP 只向企业客户提供静态 IP。请咨询您的 ISP。还要确保您用作服务器的计算机上的防火墙已打开您使用的端口。我相信您知道这一点,因为您说您可以在 LAN 上运行它。但我想我会为那些阅读本文而无法通过 LAN 和 WAN 连接的人提及它。

于 2013-08-12T23:50:48.837 回答