Java Networking“拒绝连接:连接”

时间:2011-02-10 16:22:48

标签: java sockets networking port

我一直试图让一个简单的网络测试程序运行而没有结果。

服务器:

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,因此它看起来像一个标准阻塞端口,并且没有其他可疑数据包流量正在进行。

我不知道此时发生了什么;我几乎尝试过我所知道的每一招。如果有人知道为什么端口可能被阻止,或者至少某种方式使程序工作,那将非常有帮助。

5 个答案:

答案 0 :(得分:7)

这些问题属于以下情况:

  1. 客户端和服务器,其中一个或两个都不在网络中。

  2. 服务器未运行。

  3. 服务器正在运行但没有侦听端口,客户端正在尝试连接。

  4. 主机端口组合不允许使用防火墙。

  5. 主机端口组合不正确。

  6. 连接字符串中的协议不正确。

  7. 如何解决问题:

    1. 首先ping目标服务器。如果正确ping, 然后客户端和服务器都在网络中。

    2. 尝试使用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... }

这个解决方案帮助了我,我希望它对你有所帮助。 ; - )