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)
我使用此端口:62974
但我检查控制台/提示-DOS有:
netstat -ano
端口是不在名单。
我没有使用任何防火墙,我停用它
我做了正确的事情,以查看该端口是否可用?
这是“不可用”的端口吗?
在本地或远程测试活动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 445
或PortScan 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"
问题是您正在尝试打开端口以进行两次收听。 Serversocket接受TCP连接,而DatagramSocket接受UDP数据报。您无法两次打开相同的端口。这解释了你得到的绑定IO异常。
如果'返回FALSE'的'IOException'被抛出(和被抓),因为这是去了'回报的唯一途径返回FALSE。 – twain249 2012-04-11 01:44:28
我可以确认端口62974在Windows 7上可用于TCP和UDP套接字。为什么你特别需要这个端口? – Jeffrey 2012-04-11 02:17:57
reddwarfserver lib(http://reddwarfserver.org)使用它。 Reddwarf停止工作,给出了我的示例程序的例外。 – felipe 2012-04-11 02:23:21