5

次の問題があります: 外部 IP アドレス (ローカル IP ではなく PC の IP = cmd.exe で ipconfig を実行した後に出力として表示されるもの) で TcpServer を作成しようとすると、次のエラーが発生します。

サーバーのエラー: ポート "9092" を開く際の例外 (ポートが使用中の可能性があります)、原因: "java.net.BindException: 要求されたアドレスを割り当てることができません: JVM_Bind" [90061-169]

ただし、ポートは使用されていません。netstat -a -n を使用して確認しました。外部 IP を有効にし、ルーターからファイアウォールを無効にしました。外部 IP を ping できるようになりました。

私を助けてください。

更新: これは、tcp サーバーを起動するための私のコードです。

package businessApp;

import org.h2.tools.Server; //imports the server utility

public class startTcpServerForH2 {

    Server server; //the server's instance variable

    private static final String SERVER_IP = "192.168.1.101"; //fixed IP of the server
    private static final String SERVER_PORT = "9092"; //fixed port the server is listening to

    public void tcpServer() { //method responsible to create the tcp server

        optionPane optPane = new optionPane(); //option pane for debugging purposes, shows the server's status

        try { //catches any server related errors, if the connection is broken etc.

            //server uses the IP and port defined earlier, allows other computers in the LAN to connect and implements the secure socket layer (SSL) feature
            server = Server.createTcpServer( //create tcp server
                new String[] { "-tcpPort" , SERVER_PORT , "-tcpAllowOthers" , "-tcpSSL" }).start();

            System.out.println(server.getStatus()); //prints out the server's status
            optPane.checkServerStatus(server.getStatus()); //prints out the server's status on the option pane as well

        } catch(Exception ex){
            System.out.println("Error with Server: " + ex.getMessage());
        }
    }

    public static void main(String[] args){

        startTcpServerForH2 tcpServ = new startTcpServerForH2(); //create a new server object
        tcpServ.tcpServer(); //starts the tcp server
    }
}

2 番目の更新: h2Connection コードは次のとおりです。

ビジネスアプリをパッケージ化します。

java.sql.* をインポートします。//SQL 機能をインポートします

//H2 データベース エンジンとの接続を担当するクラス public class h2Connection {

Connection conn;        //connection variable
DatabaseMetaData dbmd;  /** Metadata variable which include methods such as the following:
                         * 1) Database Product Name
                         * 2) Database Product Version
                         * 3) URL where the database files are located (in TCP mode)
                        */
Statement stm;          //statements variable
ResultSet rst;          //result sets variable

private static final String SERVER_IP = "..."; //here I enter my WAN_IP
private static final String SERVER_PORT = "9092";

public Connection connectionToH2(Connection connt) {

    optionPane optPane = new optionPane(); //create new option pane object
    String outputConn = null; //declare & initialize string which will hold important messages

    try {

        Class.forName("org.h2.Driver"); //Driver's name
        /** The String URL is pertained of the following:
         *  1) jdbc which java implements so that it can take advantage of the SQL features
         *  2) Which Database Engine will be used
         *  3) URL where the files will be stored (as this is a TCP connection)
         *  4) Schema: businessApp
         *  5) Auto server is true means that other computers can connect with the same databse at any time
         *  6) Port number of the server is also defined
         */

        String url = "jdbc:h2:tcp://" + SERVER_IP + ":" + SERVER_PORT + "/C:/Databases/businessApp;IFEXISTS=TRUE";
        System.out.println(url); //prints out the url the database files are located as well as the h2 features used (SSL)
        connt = DriverManager.getConnection(url, "sa", ""); //Driver Manager defines the username & password of the database
        System.out.println(connt.getCatalog()); //prints out the database schema
        optPane.checkServerStatus(connt.getCatalog()); //prints out the database schema on the option pane as well
        connt.setAutoCommit(false); //set AutoCommit to false to control commit actions manually

        //outputs H2 version and the URL of the database files which H2 is reading from, for confirmation
        dbmd = connt.getMetaData(); //get MetaData to confirm connection

        outputConn = "Connection to "+dbmd.getDatabaseProductName()+" "+
                   dbmd.getDatabaseProductVersion()+ " with the URL " + dbmd.getURL()+" was successful.\n";
        System.out.println(outputConn);  //outputs the message on the system (NetBeans compiler)
        optPane.checkH2Connection(outputConn); //outputs the message on top of the frame


    } catch (ClassNotFoundException ex){ //In case there is an error for creating the class for the Driver to be used
        System.out.println("Error creating class: " + ex.getMessage());
    } catch(SQLException ex){ //Any error associated with the Database Engine
        System.out.println("SQL error: " + ex.getMessage());
        optPane.checkServerStatus("SQL error: " + ex.getMessage());
    }
    return connt; //As the method is not void, a connection variable must be returned
}

}

h2 データベースに接続する場合は、新しい h2Connection オブジェクトを作成し、それを使用して接続します。私は H2 のマニュアルを一言一句たどってきました。さらに何が必要ですか?

4

1 に答える 1

8

以下に示すコマンド ライン ヘルプで提案されているように、リモート アクセスに対する保護は次のようにアドバイスします。

デフォルトでは、このデータベースは、H2 コンソール、TCP サーバー、または PG サーバーの起動時に、他のマシンからの接続を許可しません。-webAllowOthersリモート アクセスは、コマンド ライン オプション、、、-tcpAllowOthersを使用して有効にできます-pgAllowOthers

これらのオプションに関する重要な注意事項については、ドキュメントを参照してください。

補遺:ファイアウォールを開いたServer に再起動する限り、私にとってはうまくいきます。setProperty()行はまったく必要ありません。転送先のポート 9092 はホスト IP アドレスにする必要がありますLAN IPWAN_IP次に、次の方法でシェルを開くことができますWAN_IP

java -cp h2.jar org.h2.tools.Shell -url 
    jdbc:h2:tcp://WAN_IP/~/path/to/test;ifexists=true"

コマンド ライン ヘルプ:

$ java -cp .:/opt/h2/bin/h2.jar org.h2.tools.Shell -?
JDBC を使用してデータベースにアクセスするための対話型コマンド ライン ツール。
使用法: java org.h2.tools.Shell
オプションは大文字と小文字を区別します。サポートされているオプションは次のとおりです。
[-help] または [-?] オプションのリストを出力します
[-url ""] データベース URL (jdbc:h2:...)
[-user] ユーザー名
[-password] パスワード
[-driver] 使用する JDBC ドライバー クラス (ほとんどの場合は不要)
[-sql ""] SQL ステートメントを実行して終了する
[-properties ""] このディレクトリからサーバー プロパティを読み込みます
特殊文字が期待どおりに機能しない場合は、使用する必要がある場合があります
 -Dfile.encoding=UTF-8 (Mac OS X) または CP850 (Windows)。
http://h2database.com/javadoc/org/h2/tools/Shell.html も参照してください。

$ java -cp /opt/h2/bin/h2.jar org.h2.tools.Server -?
H2 コンソール (Web) サーバー、TCP、および PG サーバーを起動します。
使用法: java org.h2.tools.Server
オプションなしで実行すると、-tcp、-web、-browser、-pg が起動されます。
オプションは大文字と小文字を区別します。サポートされているオプションは次のとおりです。
[-help] または [-?] オプションのリストを出力します
[-web] H2 コンソールで Web サーバーを起動します
[-webAllowOthers] 他のコンピューターの接続を許可する - 以下を参照
[-webDaemon] デーモン スレッドを使用する
[-webPort] ポート (デフォルト: 8082)
[-webSSL] 暗号化 (HTTPS) 接続を使用する
[-browser] Web サーバーに接続するブラウザーを起動します
[-tcp​​] TCP サーバーを起動します
[-tcp​​AllowOthers] 他のコンピューターの接続を許可する - 以下を参照
[-tcp​​Daemon] デーモン スレッドを使用する
[-tcp​​Port ] ポート (デフォルト: 9092)
[-tcp​​SSL] 暗号化 (SSL) 接続を使用する
[-tcp​​Password ] TCP サーバーをシャットダウンするためのパスワード
[-tcp​​Shutdown ""] TCP サーバーを停止します。例: tcp://localhost
[-tcp​​ShutdownForce] すべての接続が閉じられるまで待機しない
[-pg] PG サーバーを起動します
[-pgAllowOthers] 他のコンピューターの接続を許可する - 以下を参照
[-pgDaemon] デーモンスレッドを使用
[-pgPort] ポート (デフォルト: 5435)
[-properties ""] サーバー プロパティ (デフォルト: ~、無効: null)
[-baseDir] H2 データベースのベース ディレクトリ (すべてのサーバー)
[-ifExists] 既存のデータベースのみを開くことができます (すべてのサーバー)
[-trace] 追加のトレース情報を出力します (すべてのサーバー)
オプション -xAllowOthers は潜在的に危険です。
詳細については、高度なトピック / リモート アクセスに対する保護を参照してください。
http://h2database.com/javadoc/org/h2/tools/Server.html も参照してください。
于 2013-01-14T06:00:55.393 に答える