Java:端口不可用(在Windows 7上)

问题描述:

解决: 问题是一个“病毒”或类似的东西被劫持的端口。 OBS:该病毒以某种方式劫持了该端口,该端口未出现在正在使用的端口的netstat -an或TCPView上。Java:端口不可用(在Windows 7上)

我使用AVG防病毒来清除病毒。 另一款防毒软件无法使用,只是AVG。


我做了这个程序来检查,如果一个端口可用:

package com.test; 

import java.io.IOException; 
import java.net.DatagramSocket; 
import java.net.ServerSocket; 

public class Test { 
    public static void main(String[] args) { 
     System.out.println("Port available: " + available(62974)); 
    } 
    public static boolean available(int port) { 
     ServerSocket ss = null; 
    try { 
     ss = new ServerSocket(port); 
     ss.setReuseAddress(true); 
     return true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (ss != null) { 
      try { 
       ss.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    return false; 
    } 
} 

的响应是假

引发的异常是:

java.net.BindException: Address already in use: JVM_Bind 
    at java.net.PlainSocketImpl.socketBind(Native Method) 
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383) 
    at java.net.ServerSocket.bind(ServerSocket.java:328) 
    at java.net.ServerSocket.<init>(ServerSocket.java:194) 
    at java.net.ServerSocket.<init>(ServerSocket.java:106) 
    at com.dgs.test.Test.available(Test.java:16) 
    at com.dgs.test.Test.main(Test.java:9) 

我使用此端口:62​​974

但我检查控制台/提示-DOS有:

netstat -ano 

端口是不在名单

我没有使用任何防火墙,我停用它

我做了正确的事情,以查看该端口是否可用?

这是“不可用”的端口吗?

+0

如果'返回FALSE'的'IOException'被抛出(和被抓),因为这是去了'回报的唯一途径返回FALSE。 – twain249 2012-04-11 01:44:28

+0

我可以确认端口62974在Windows 7上可用于TCP和UDP套接字。为什么你特别需要这个端口? – Jeffrey 2012-04-11 02:17:57

+0

reddwarfserver lib(http://reddwarfserver.org)使用它。 Reddwarf停止工作,给出了我的示例程序的例外。 – felipe 2012-04-11 02:23:21

在本地或远程测试活动TCP/UDP端口时,您的代码应该尝试成为客户端而不是服务器。

package com.test; 

import java.io.IOException; 
import java.net.Socket; 

public class PortScan { 
    public static void main(String[] args) { 
     if (args.length > 0){ 
      System.out.println("Port active: " + available(args[0], args[1])); 
     } 
     else System.out.println("Usage: PortScan <ip> <port>"); 
    } 

    public static boolean available(String ip, String port) { 
     boolean status = false; 
     Socket ss = null; 
     try { 
      ss = new Socket(ip, Integer.parseInt(port)); 
      status = true; //there is a listening port 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (ss != null) { 
       try { 
        ss.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     return status; 
    } 
} 

借此当前nestat -ano结果:

TCP 192.168.72.1:139  0.0.0.0:0    LISTENING  4 
    TCP 192.168.184.1:139  0.0.0.0:0    LISTENING  4 
    UDP 0.0.0.0:445   *:*         4 

当已经有一个UDP服务是活动的,但它不是在127.0.0.1:445听或TCP服务是活动的,它当您测试PortScan 127.0.0.1 445PortScan 192.168.184.1 139时,它会连接并说“Port active:true”:

当在给定端口(可能不是活动或阻塞)没有服务时;让说:“127.0.0.1:446”,它会抓住一个“连接被拒绝”,并说“港口活动:假”:

java.net.ConnectException: Connection refused: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at com.test.PortScan.available(PortScan.java:18) 
    at com.test.PortScan.main(PortScan.java:9) 
Port active: false 

但是,您将需要检查它为什么拒绝;它真的不活跃或被防火墙阻止?这是一个棘手的问题,你需要找出答案。

之后,你可以编码成为一个服务器,并尝试建立自己的自由/禁用端口上,如下图所示:

 ServerSocket serverSocket = null; 
     Socket socket = null; 
     try { 
      serverSocket = new ServerSocket(Integer.parseInt(port)); 
      serverSocket.setReceiveBufferSize(2048); 
      serverSocket.setSoTimeout(0); 
      serverSocket.setReuseAddress(true); 
      socket = serverSocket.accept(); 
     } catch (NumberFormatException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     //do something here in a loop 

     try { 
      socket.close(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

更新:

确保以前的运行(涉及服务器代码部分)在Eclipse中尝试再次与另一个运行连接时正确关闭。检查Eclipse的调试视图并在测试之前关闭有问题的以前的运行。否则,当您尝试在已处于活动状态的相同端口上建立服务器代码时,您将获得BindException

要检查服务器端口是否已经建立,使用方法:

netstat -ano | find "62974" 
+0

我关闭了防火墙,你说得对,“连接拒绝”是在端口62974上抛出的。 我也用TCPV查看端口是否可用。难道它不是一个日食发射问题? – felipe 2012-04-11 03:11:10

+0

当您尝试再次连接另一次运行时,可能是上一次运行未正确关闭。检查Eclipse的调试视图并关闭有问题的以前的运行。 – ecle 2012-04-11 03:31:44

+0

这不是这个。这对我来说是非常愚蠢的。但我们必须检查所有可能性。 – felipe 2012-04-11 04:14:03

问题是您正在尝试打开端口以进行两次收听。 Serversocket接受TCP连接,而DatagramSocket接受UDP数据报。您无法两次打开相同的端口。这解释了你得到的绑定IO异常。

+1

TCP和UDP“端口空间”是不相交的,您可以同时使用相同的端口。 – 2012-04-11 02:09:59

+0

Thron,我改了程序: 现在程序刚刚打开一个ServerSocket。这个例外是当它到达该行时抛出相同的广告:“new ServerSocket(port); Thanks。 – felipe 2012-04-11 02:12:23

+0

reboot your computer and try again。 – Thorn 2012-04-11 02:41:46