使用java监视sql连接信息

时间:2012-09-25 08:25:49

标签: java mysql jdbc connection monitoring

更新:我完全按照朋友建议的方式解决了这个问题。但我有点想念我必须遵循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:");

它不会打印“客户端:” 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您不能将自己的服务器绑定在与DB-Server实例相同的端口上。

如果你真的想要“监控”它,请使用一个“中间人”:将数据库设置为另一个端口,比如4445.然后在显示器内部听4444,客户端将连接并制作你自己与4445的连接。然后在两者之间转发输入和输出。

编辑: 好的,我们清除了。忘掉我答案的第一部分。

您的服务器运行在4444上,您的数据库运行在3306上。

因此,在您的监视器中,您将需要两个连接:一个Monitor-Client和一个Monitor-DB。 你必须有两个线程读取每个线程并将其读取的内容写入另一个。

我不知道你是否会对使用readLine感到满意。为了检查发送的内容,我建议读取字节...