Java套接字在局域网上工作但不在Internet上工作?

时间:2012-04-10 18:33:50

标签: java performance sockets multiplayer

您好我正在制作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秒才能从1个客户端到另一个客户端,它应该几乎是即时的,因为它位于同一个网络上并且我有一个快速的互联网。

编辑: 我尝试在与客户端相同的PC上创建服务器,然后在使用我的全局IP加入时,它不起作用:(

编辑: 它的工作即便如此,我现在所做的一切都是在防火墙上添加港口,谢谢你们这么多人:D。现在我可以和我的朋友一起玩:3

3 个答案:

答案 0 :(得分:7)

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

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

BTW:你应该在创建ObjectInputStream之前创建你的ObjectOutputStream AND flush(),否则另一端的ObjectInputStream可以永久阻塞。

答案 1 :(得分:5)

您需要阅读firewalls(它控制从LAN外部连接到计算机的内容),port forwarding(可以将公共IP地址转发到内部IP地址),以及IP addressing一般来说(它会为您提供有关IP地址如何工作,公共/私有以及数据如何通过网络传输的信息)。

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

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

答案 2 :(得分:0)

您需要来自ISP的静态IP地址,并且需要转发路由器中的端口以指向您正在使用的服务器的LAN IP。 192.168.1.xxx注意:某些ISP仅向企业客户提供静态IP。请咨询您的ISP。还要确保您作为服务器使用的计算机上的防火墙具有您正在使用的端口。我相信你知道的,因为你说你在局域网上工作了。但是我想我会为那些读过这些因无法通过局域网和广域网连接而烦恼的人提及它。