1

更新:友人が提案したのとまったく同じ方法でこの問題を解決しました。しかし、結果を得るためにmysqlのプロトコルに従わなければならないという事実を見逃していました。mysql では、最初のハンドシェーク パケットにデータ フィールドがないため、getInputStream でデータを取得できません。唯一の方法は、独自のサーバーで mysql 接続を作成し、結果をクライアントに送信することです。それは非常にうまく機能します。みんなありがとう

javaでmysqlの接続情報を読みたい。たとえば、ポート 4444 で Java を使用してサーバー ソケットを作成しました。次に、ポート 4444 で jdbc 接続を作成しました。しかし、うまくいきません。理由はわかりませんし、それが可能かどうかもわかりません。これはサーバーコードです:

int portNr = 4444;
// Create a ServerSocket object to watch that port for clients
ServerSocket ss;
try {
    ss = new ServerSocket(portNr);

    System.out.println("starting...");

    // Here we loop indefinitely, just waiting for clients to connect
    while (true) {

        // accept() does not return until a client requests a connection
        // Now that a client has arrived, create an instance of our
        // special
        // thread subclass to respond to it.
        Socket clientSocket = null;
        try {
            clientSocket = ss.accept();

            System.err.println("heheh"+clientSocket);
            // PrintWriter out = new
            // PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                  new InputStreamReader(clientSocket.getInputStream()));
            String inputLine = in.readLine();
            System.err.println(inputLine)....;</i>

「へへへ」と表示されます。ただし、入力行は出力されません。

そして、これは私の接続コードです:

public class messagetest
{
    // The JDBC Connector Class.
    private static final String dbClassName = "com.mysql.jdbc.Driver";

    private static final String CONNECTION =
                      "jdbc:mysql://127.0.0.1:4444/shadi";

    public static void main(String[] args) throws
                         Exception,SQLException
     {
        System.out.println(dbClassName);

        Class.forName(dbClassName);

        // Properties for user and password. Here the user and password are both 'paulr'
        Properties p = new Properties();
        p.put("user","--------");
        p.put("password","-------");

        System.err.println("after p");
        Connection c = DriverManager.getConnection(CONNECTION,p);

        System.err.println("client:");

「client:」は表示されません。ご協力ありがとうございます。

4

1 に答える 1

2

DB-Server インスタンスと同じポートに独自のサーバーをバインドすることはできません。

本当にそのように「監視」したい場合は、小さな「中間者」を使用します。DB を別のポート、たとえば 4445 に設定します。次に、モニター内で 4444 をリッスンし、クライアントが接続して独自の接続を確立します。次に、2 つの間で入力と出力を転送します。

編集:OK、私たちはそれを片付けました。私の答えの最初の部分は忘れてください。

サーバーは 4444 で実行され、データベースは 3306 で実行されます。

したがって、モニターには 2 つの接続が必要です。1 つの Monitor-Client と 1 つの Monitor-DB です。2 つのスレッドがそれぞれを読み取り、読み取った内容を他のスレッドに書き込む必要があります。

そして、あなたが readLine を使って満足するかどうかはわかりません。何が送信されているかを確認するには、バイトを読み取ることをお勧めします...

于 2012-09-25T08:28:12.177 に答える