首页 文章

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

提问于
浏览
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);

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

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

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

3 回答

  • 5

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

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

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

  • 0

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

    从那里开始,如果在将来的问题中,你重新连接 fromto (公共或其他),发生了什么错误消息(不仅仅是代码),以及你认为什么是故障排除会话,那将非常有用 - 我们确实需要特定的错误消息,如何配置端口转发,防火墙是什么等等,以及你发布的东西(虽然代码可能实际上不是问题 - 它可能更像是一个配置问题) .

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

  • 7

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

相关问题