繁体   English   中英

Java Networking“拒绝连接:连接”

[英]Java Networking “Connection Refused: Connect”

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

服务器:

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

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

这些问题属于以下情况:

  1. 客户端和服务器,它们中的任何一个或两个都不在网络中。

  2. 服务器未运行。

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

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

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

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

如何解决问题:

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

  2. 尝试使用telnet连接到服务器主机和端口。 如果你能够连接它,那么你在客户端代码中犯了一些错误。

对于它的价值,您的代码在我的系统上运行良好。

我不愿意这么说,但这听起来像是防火墙问题(我知道你已经三重检查)或康卡斯特问题 ,这比你想象的更有可能。 我会测试你的ISP

我有同样的问题,因为有时客户端在服务器之前启动,当他试图建立连接时,它找不到正在运行的服务器。

我的第一个(不太优雅)解决方案是使用sleep方法停止客户端一段时间:

try {
   Thread.sleep(1000);
} 
catch (InterruptedException e) {
   e.printStackTrace();
}

我在客户端连接之前使用此代码,在您的示例中,就在Socket sock = new Socket(HOSTNAME, PORT_NUMBER);

我的第二个解决方案是基于这个答案。 基本上我在客户端类中创建了一个方法,此方法尝试连接到服务器,如果连接失败,它会在重试前等待两秒钟。 这是我的方法:

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 sock = createClientSocket(HOSTNAME, PORT_NUMBER);
if(null == sock){ //log error... }

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

可能服务器套接字仅绑定到localhost地址。 您可以使用构造函数的3参数形式将其绑定到特定的IP地址。

我假设您使用路由器连接到Internet。 您应该进行端口转发以让公众访问您的内部网络。 看看如何让Java套接字与公共IP协同工作?

我还写了一篇关于端口转发的博客文章,你可能想看看:) http://happycoders.wordpress.com/2010/10/03/how-to-setup-a-web-server-by-yourself /

但我仍然无法通过公共IP访问它,现在正在努力...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM