Java Networking“拒绝连接:连接”

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

服务器:

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

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

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

我讨厌这样说,但这听起来像是防火墙问题(我知道你已经三重检查)或者是Comcast问题 ,这比你想象的更有可能。 我要测试你的ISP 。

这些问题属于以下情况:

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

  2. 服务器未运行。

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

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

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

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

如何解决问题:

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

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

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

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

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

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

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

我的第一个(不太优雅)解决方案是使用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... } 

这个解决方案对我有所帮助,我希望它对你有所帮助。 😉