1

解決済み: 問題は、ポートを乗っ取った「ウイルス」または同様のものでした。OBS:ウイルスは、使用されているポートのnetstat-anまたはTCPViewにポートが表示されない方法でポートをハイジャックしました。

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

しかし、私はコンソール/プロンプトをチェックします-次のようにします:

netstat -ano 

ポートはリストにありません

ファイアウォールを使用していません。非アクティブ化しました

ポートが使用可能かどうかを確認するために正しいことをしていますか?

これは「使用できない」ポートですか?

4

2 に答える 2

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;
    }
}

この現在の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サービスがアクティブで、192.168.184.1:139でリッスンしている場合、PortScan 127.0.0.1 445またはをテストPortScan 192.168.184.1 139すると、接続して「ポートがアクティブです:true ":

特定のポートにサービスがない場合(おそらくアクティブまたはブロックされていない場合)。「127.0.0.1:446」とすると、「接続が拒否されました」と表示され、「ポートがアクティブです:false」と表示されます。

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"
于 2012-04-11T02:59:17.280 に答える
-1

問題は、2回リッスンするためにポートを開こうとしていることです。ServersocketはTCP接続を受け入れ、DatagramSocketはUDPデータグラムを受け入れます。同じポートを2回開くことはできません。これは、発生しているバインディングIO例外を説明しています。

于 2012-04-11T02:00:32.563 に答える