Java套接字可以在局域网上工作,但不能在Internet上工作?

Java套接字可以在局域网上工作,但不能在Internet上工作?,java,performance,sockets,multiplayer,Java,Performance,Sockets,Multiplayer,你好,我正在制作一个Java多人游戏,一切正常。 它具备了所有用户需要的功能,但我发现了一个问题,它使用ServerSocket作为服务器,Socket作为客户端,工作正常,但最大的问题是它无法在全球范围内工作。只有兰,我甚至试过Hamachi,但也没用 你有什么想法吗 更多信息:我使用服务器中的特定线程来接受、发送和接收套接字,也使用客户端中的特定线程来发送和接收套接字。它发送一个我制作的对象并包含所有信息 ip = InetAddress.getLocalHost().getHostAddr

你好,我正在制作一个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秒的时间,而且应该是即时的,因为它在同一个网络上,我有一个快速的互联网

编辑: 我尝试在带有客户端的同一台pc上创建服务器,但当使用我的全局IP加入时,它不起作用:(

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

当你连接到互联网上的Java web服务器时,它将使用ServerSocket和Socket。这很好用

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

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

您需要仔细阅读(它控制允许从LAN外部连接到机器的内容),(它可以将公共IP地址转发到内部IP地址),一般来说(这将为您提供有关IP地址如何工作、什么是公共/私有以及数据如何通过网络传输的一些信息)

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


我基本上是说,虽然这是一个非常宽泛的答案,但你的问题也非常宽泛,没有明确的问题。

你需要ISP提供一个静态IP地址,你需要转发路由器中的端口,以指向你正在使用的服务器的LAN IP。例如192.168.1.xxx注意:一些ISP只提供向企业客户发送IP。请咨询您的ISP。还要确保您用作服务器的计算机上的防火墙已打开您正在使用的端口。我肯定您知道这一点,因为您说过它在LAN上工作。但是我想我会向读到这篇文章的人提及,他们在LAN和WAN上连接有困难。

你的意思是它在全球范围内不起作用?你确定你已经正确地设置了端口转发吗?是的,完全肯定,还有防火墙。互联网上的用户只需使用主机名/IP和端口号就可以远程登录到你机器上的服务?嗨-正如Peter Lawrey指出的,你的问题可能与Java没有什么关系,一切都与Java有关网络配置。请阅读防火墙、NAT等。还请考虑获取“WiReSARK”的副本:好的,但这意味着连接不起作用-我们知道。原因可能是防火墙/端口转发配置中的任何地方,可能是客户端和/或服务器端,可能是所有客户端,也可能只是一些客户端,等等。不幸的是,这还不足以给出如此广泛的错误消息。您需要检查配置,测试eac连接过程中的h步骤,找出连接在哪一步失败,然后从这一点开始问一个更具体的问题,以及相关的日志、错误和配置详细信息。好的,我允许防火墙上的端口、进出口和端口转发(再次),现在我要通过hamachi正常测试游戏:)