我一直试图让一个简单的网络测试程序运行而没有结果。
服务器:
import java.io.*;
import java.net.*;
public class ServerTest {
public static void main(String[] args) {
final int PORT_NUMBER = 44827;
while(true) {
try {
//Listen on port
ServerSocket serverSock = new ServerSocket(PORT_NUMBER);
System.out.println("Listening...");
//Get connection
Socket clientSock = serverSock.accept();
System.out.println("Connected client");
//Get input
BufferedReader br = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
System.out.println(br.readLine());
br.close();
serverSock.close();
clientSock.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
客户端:
import java.io.*;
import java.net.*;
public class ClientTest {
public static void main(String[] args) throws IOException {
final int PORT_NUMBER = 44827;
final String HOSTNAME = "xx.xx.xx.xx";
//Attempt to connect
try {
Socket sock = new Socket(HOSTNAME, PORT_NUMBER);
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
//Output
out.println("Test");
out.flush();
out.close();
sock.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
当我使用127.0.0.1或我的内部IP作为主机名时,程序运行正常。但每当我切换到我的外部IP地址时,它都会引发java.net.ConnectException: Connection refused: connect
错误。
我故意选择这样一个不常见的端口,看看是不是问题,没有运气。 我可以使用telnet连接没有问题,但是当我尝试使用canyouseeme.org访问端口时,它告诉我连接超时。 我甚至试图禁用所有防火墙和防病毒软件,包括Windows默认防火墙和路由器防火墙,所有端口都已转发并启用了DMZ,它仍然表示连接超时。我使用Comcast作为我的ISP,我怀疑他们阻止这样一个随机端口。
当我使用数据包跟踪器时,它显示TCP流量,我的计算机发送SYN并接收RST / ACK,因此它看起来像一个标准阻塞端口,并且没有其他可疑数据包流量正在进行。
我不知道此时发生了什么;我几乎尝试过我所知道的每一招。如果有人知道为什么端口可能被阻止,或者至少某种方式使程序工作,那将非常有帮助。
答案 0 :(得分:7)
这些问题属于以下情况:
客户端和服务器,其中一个或两个都不在网络中。
服务器未运行。
服务器正在运行但没有侦听端口,客户端正在尝试连接。
主机端口组合不允许使用防火墙。
主机端口组合不正确。
连接字符串中的协议不正确。
如何解决问题:
首先ping目标服务器。如果正确ping, 然后客户端和服务器都在网络中。
尝试使用telnet连接到服务器主机和端口。如果你是 能够与它连接,然后你在客户端代码中犯了一些错误。
答案 1 :(得分:2)
对于它的价值,你的代码在我的系统上运行良好。
我讨厌说出来,但这听起来像是防火墙问题(我知道你已经三重检查)或Comcast issue,这比你想象的更有可能。我test your ISP。
答案 2 :(得分:0)
可能服务器套接字仅绑定到localhost地址。您可以使用构造函数的3参数形式将其绑定到特定的IP地址。
答案 3 :(得分:0)
我假设您使用路由器连接到Internet。您应该进行端口转发以让公众访问您的内部网络。看看How do you get Java sockets working with public IPs?
我还写了一篇关于端口转发的博客文章,你可能想看看:) http://happycoders.wordpress.com/2010/10/03/how-to-setup-a-web-server-by-yourself/
但是我仍然无法通过公共IP访问它,现在正在努力...
答案 4 :(得分:0)
我遇到了同样的问题,因为有时客户端在服务器之前启动,当他尝试建立连接时,它无法找到正在运行的服务器。
我的第一个(不那么优雅)解决方案是使用sleep方法停止客户端一段时间:
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
我在客户端连接之前使用此代码,在您的示例中,就在Socket sock = new Socket(HOSTNAME, PORT_NUMBER);
我的第二个解决方案基于this回答。基本上我在客户端类中创建了一个方法,此方法尝试连接到服务器,如果连接失败,它会在重试前等待两秒钟。 这是我的方法:
private Socket createClientSocket(String clientName, int port){
boolean scanning = true;
Socket socket = null;
int numberOfTry = 0;
while (scanning && numberOfTry < 10){
numberOfTry++;
try {
socket = new Socket(clientName, port);
scanning = false;
} catch (IOException e) {
try {
Thread.sleep(2000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
return socket;
}
正如你所看到的,这个方法尝试创建一个套接字十次,然后为socket返回一个空值,所以要小心并检查结果。
您的代码应该成为:
Socket sock = createClientSocket(HOSTNAME, PORT_NUMBER);
if(null == sock){ //log error... }
这个解决方案帮助了我,我希望它对你有所帮助。 ; - )