【发布时间】:2014-10-10 19:36:45
【问题描述】:
我正在学习使用 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 地址提供给我的客户端。但是,连接永远不会建立:服务器或客户端都不会生成套接字。
- 适用于 Java 7 和 8。
- 尝试了几个不同的端口。
- 不抛出异常。两个程序都挂在那里等待。
- 我在两台机器上都使用 Mac OSX Mavericks 10.9.5。
- 两台机器上的防火墙均已关闭。
- 他们确实连接到互联网。事实上,我使用 Chrome 远程桌面来控制服务器并检查其状态。
- 当两台机器都在同一个房子里时,这可以正常工作。但当一个人在家里,另一个人在其他地方时,情况就不同了。
- 是的,这也适用于 localhost。
以上几点似乎表明问题出在我用来连接服务器的 IP 地址上。也许InetAddress.getLocalHost().getHostAddress() 不适合这个 - 虽然它让我感到困惑,为什么这可以在同一个房子里的两台机器上工作。
我做错了什么?
【问题讨论】:
-
在您的问题中发布堆栈跟踪。总是。此代码不会永远阻塞。我怀疑您遇到了连接超时。它发生在一分钟左右后。也许你不够耐心。
-
@Voldemort,您是否进一步分析了问题?
标签: java sockets networking