我正在学习使用Java进行套接字编程。使用Java 8,拥有这个简单的服务器:
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("MY IP address is " + InetAddress.getLocalHost().getHostAddress());
ServerSocket server = new ServerSocket(4031);
Socket socket = server.accept();
System.out.println("Yay somebody connected! " + socket);
socket.close();
server.close();
}
}
它只是显示主机的地址,然后等待套接字连接。
有这个客户:
import java.net.Socket;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("Trying to connect...");
Socket s = new Socket("123.456.7.890", 4031);
System.out.println("Cool");
s.close();
}
}
当我在家里(在两台不同的计算机上)运行服务器和客户端时,这样可行:我只需抓取服务器显示的IP地址,将其提供给客户端,然后建立连接。
现在我家里有同样的服务器,而我在办公室里运行我的客户端。在同一过程中,我将服务器打印的IP地址提供给了我的客户端。但是,永远不会建立连接:服务器或客户端都不会生成套接字。
以上几点似乎表明问题在于我用来连接到服务器的IP地址。也许InetAddress.getLocalHost().getHostAddress()
不适合这个 - 虽然它让我感到困惑,为什么这可以在同一栋房子里使用两台机器。
我做错了什么?
答案 0 :(得分:1)
您说两台计算机上的防火墙都已关闭,但您还必须确保
您连接到公共 IP。服务器报告的IP可能是您通过DHCP从路由器收到的LAN IP
您还必须确保将路由器配置为将公共IP的端口4031的连接转发到服务器的IP(而不是本地网络上的其他计算机)。
最后,您的ISP在家中禁止设置服务器的风险很小。在这种情况下,它们可能是如此邪恶,以至于阻止传入的连接。