【发布时间】:2011-06-24 23:46:24
【问题描述】:
我一直在尝试运行一个简单的网络测试程序,但没有任何结果。
服务器:
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,我怀疑他们会阻止这样一个随机端口。
当我使用数据包跟踪器时,它会显示我的计算机发送 SYN 并接收 RST/ACK 的 TCP 流量,因此它看起来像是一个标准的阻塞端口,并且没有其他可疑的数据包流量正在发生。
我不知道此时发生了什么;我几乎尝试了所有我知道的技巧。如果有人知道为什么端口可能被阻止,或者至少有某种方法可以使程序正常工作,那将非常有帮助。
【问题讨论】:
-
我可能说的很明显,但你能
telnet到港口吗?这将有助于定位问题。另一个尝试的选择是只用一个监听netcat替换服务器进程,看看你是否可以连接到它。 -
也许有人可以给我一个简单的客户端/服务器程序,他们知道他们肯定可以在他们的计算机上运行。这将帮助我弄清楚问题是否仍然存在于端口转发和防火墙或我的代码上。
标签: java sockets networking port