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

4 java sockets performance 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();
Run Code Online (Sandbox Code Playgroud)

以下是我发现最重要的客户端内容:

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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pet*_*rey 7

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

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

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

  • 嗨 - 正如Peter Lawrey指出的那样,你的问题可能与Java没什么关系,而且与网络配置有关.请阅读防火墙,NAT等.另请考虑获取"wireshark"的副本:http://www.wireshark.org. (2认同)

jef*_*unt 5

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

从那里,它是,如果真的很有帮助,在未来的问题,你会发布哪些IP地址你连接(公共或其他),有什么错误消息出现(不只是代码),和你"已经尝试过但失败了.stackoverflow上的Q/A并不是故障排除会话 - 我们确实需要特定的错误消息,如何配置端口转发,防火墙到底等等,以及您尝试过的事情.目前,鉴于您发布的代码,全球范围内存在许多潜在问题(尽管代码可能实际上不是问题 - 它可能更多是配置问题).

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