当前位置: 首页 > 知识库问答 >
问题:

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

羊舌洛华
2023-03-14

你好,我正在制作一个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

共有3个答案

谢灵均
2023-03-14

你需要一个静态的IP地址从你的ISP,你需要转发端口在你的路由器指向局域网IP的服务器,你正在使用例如。192.168.1.xxx注意:一些ISP只提供静态IP的业务客户。检查与你的ISP。还确保防火墙上的机器,你正在使用的服务器上有你正在使用的端口打开。我相信你知道这一点,因为你说你有它在局域网上工作。但我想我会提一下,对于那些谁读到这一点有困难通过局域网和广域网连接。

宫俊远
2023-03-14

您需要了解防火墙(它控制允许从LAN外部连接到机器的内容)、端口转发(它可以将公共IP地址转发到内部IP地址)和一般的IP地址(这将为您提供有关IP地址如何工作、什么是公共/专用的,以及数据如何在网络上传输的一些信息)。

从这里开始,如果在以后的问题中,你能发布你正在连接的IP地址(公共或其他)、正在发生的错误消息(不仅仅是代码),以及你已经尝试过的和失败的。stackoverflow上的Q/A并不是一个故障排除会话——我们真的需要特定的错误消息、端口转发的配置方式、防火墙的设置等等,以及您尝试过的事情。目前,考虑到您发布的代码,worldwide play存在许多潜在问题(尽管代码可能不是问题所在——可能更多的是配置问题)。

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

于鹏
2023-03-14

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

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

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

 类似资料:
  • 我试图制作一个跨平台的JavaFX应用程序,它在Windows和OSX机器上工作得很好,但在Linux上不行。 jar是在Intellij思想中使用基本的JavaFX配置构建的。 有人帮忙吗?

  • 我是android新手,我能够在kotlin中为我的应用程序设置firebase。如果我在Nexus 5X API 27 emulator中运行该应用程序,我就能够获取数据库,但当我在实际设备三星S5(Google play Services V 12.5.29,android V 5.0)中运行该应用程序时,我无法获得addValueEventListener回调。 Gradle文件: 我知道这

  • 我实现了一个简单的Java实用程序类,使用aes/gcm/nopadding进行加密和解密。我使用这段代码: IV总是一个12字节数组,key是32字节数组,SecureRandom使用种子生成。我知道在不同的OS上SecureRandom是不同的,但是加密和解密是在同一个OS上执行的,所以应该没有问题。 是不是很线性,对吧?它在Windows上工作得很好,加密和破译返回相同的文本。然而,在Doc

  • 与/user/login?_format=json完全相同的POST在Postman中不起作用(错误403禁止),但在curl中使用相同的参数可以正常工作。 这个Curl的工作原理是:Curl--header“content-type:application/json”--request POST--data“{”name“:”bobo“,”pass“:”xxx“}”http://[domain]

  • 我有一段非常简单的Java代码,在那里我尝试从Java连接到我的Oracle DB。 在Windows下一切正常,但当我尝试在Ubuntu上运行时,我得到了一个错误。 我读了很多书,也试过很多解决方法。这是我的代码: 当我运行它时,我收到一个错误: 连接失败Java.sql.sqlRecoverable异常:IO错误:网络适配器无法在oracle.jdbc.driver.T4CConnection

  • 我正在构建一个web推送通知系统,并使用本例中使用的概念: https://github.com/Minishlink/web-push-php-example 我的JS文件中有以下代码。它检查API支持,检查通知是否被禁用,注册服务人员,请求显示通知的权限,如果允许,订阅用户并将详细信息发送到服务器。如果用户已经订阅,它会更新数据库中的endpoint值。 当我在火狐61上运行时,它工作正常,但