解决: 问题是"病毒"或类似的东西劫持港口。 OBS:病毒以端口没有出现在netstat -an或正在使用的端口的TCPView上的方式劫持了por。
我使用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;
}
}
回复 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
但是我用:
检查Console / prompt-dosnetstat -ano
端口不在列表中。
我没有使用任何防火墙,我将其停用
我是否正确地查看该端口是否可用?
这是&#34;不可用&#34;端口?
答案 0 :(得分:0)
在本地或远程测试活动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;
}
}
拿这个当前的巢穴 - 结果:
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:454监听或TCP服务处于活动状态并且正在监听192.168.184.1:139时,当您测试PortScan 127.0.0.1 445
或{时{1}},它将连接并说“Port active:true”:
当给定端口没有服务时(可能没有活动或被阻止);让我们说“127.0.0.1:446”,它将捕获“拒绝连接”并说“端口活动:错误”:
PortScan 192.168.184.1 139
但是,你需要检查它拒绝的原因;是真的没有活动还是被防火墙阻止了?这是一个棘手的问题,你需要找出来。
之后,您可以编写代码成为服务器并尝试在免费/非活动端口上建立自己,如下所示:
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
<强>更新强>
当您尝试再次与另一次运行连接时,请确保在Eclipse中正确关闭了上一次运行(涉及服务器代码部分)。检查Eclipse的调试视图并在测试之前关闭违规的先前运行。否则,当您尝试在已经处于活动状态的同一端口上建立服务器代码时,您将获得 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();
}
。
要检查服务器端口是否已建立,请使用:
BindException
答案 1 :(得分:-1)
问题是您正在尝试打开端口以进行两次侦听。 Serversocket接受TCP连接,而DatagramSocket接受UDP数据报。您无法两次打开相同的端口。这解释了您获得的绑定IO异常。