Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将结果集的所有行返回给客户端?_Java_Mysql_Database - Fatal编程技术网

Java 如何将结果集的所有行返回给客户端?

Java 如何将结果集的所有行返回给客户端?,java,mysql,database,Java,Mysql,Database,我正在编写一个java应用程序,其中客户端发送一个查询,服务器获取结果并将其发送回客户端 代码如下: private ServerSocket serverSocket; private Socket socket; private BufferedReader bufferedReader; private PrintWriter printWriter; private String message; private Connection c

我正在编写一个java应用程序,其中客户端发送一个查询,服务器获取结果并将其发送回客户端

代码如下:


    private ServerSocket serverSocket;
    private Socket socket;
    private BufferedReader bufferedReader;
    private PrintWriter printWriter;
    private String message;
    private Connection connection; //rappresenta la connessione col database
    private ResultSet resultSet; //rappresenta i risultati della query
    private Statement stmt; //rappresenta la query

    public ServerSql() throws IOException, ClassNotFoundException, SQLException {
        serverSocket = new ServerSocket(5000);
        Class.forName("com.mysql.cj.jdbc.Driver");
        //connessione al database
        connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","");
    }

    @Override
    public void run() {
        try {
            while(true){
                socket = serverSocket.accept();
                printWriter = new PrintWriter(socket.getOutputStream(),true);
                bufferedReader =  new BufferedReader(new InputStreamReader(socket.getInputStream()));
                message = bufferedReader.readLine();
                stmt = (Statement) connection.createStatement();
                resultSet = stmt.executeQuery(message);
                while (resultSet.next()) {
                    String id = resultSet.getString(1);
                    String nome = resultSet.getString(2);
                    String cognome = resultSet.getString(3);
                    String result = id + nome + cognome;
                    printWriter.println(result);
                }

            }
        } catch (IOException | SQLException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) throws SQLException, IOException, ClassNotFoundException {
        new Thread(new ServerSql()).start();
    }
}


正如您在服务器代码中看到的,我将每行的所有3列保存在3个变量中,然后生成一个字符串并将其发送给客户机,它可以工作,但客户机只收到一个字符串,如果我将readline放入循环中,我如何知道何时停止它?我应该做一根线让它一直听吗? 我想知道做这件事的最佳方法是什么,起初我想序列化resultset,但它没有实现serializable;那么我应该使用二维数组吗?如果是,将每个记录放在其位置的代码是什么


我到处都搜索了,但我不明白正确的方法是什么,请帮助。

如何迭代服务器上的结果集,并将其保存到列表中,然后将列表作为字符串进行jsonify并发送给客户端。客户端可以再次将json字符串转换为列表。有一些库可用于json转换

如果您不喜欢json,还可以尝试其他现有的数据类型。或者只是创建自己的数据类型,实现可序列化,因为客户机和服务器都使用java

如果数据量很大,您可以在服务器端控制一次发送多少条记录,例如每批10000条记录。每10000,您将以json字符串的形式发送数据。您的客户机必须一直在侦听,直到它在整个会话结束时从服务器读取某些内容,例如,您从服务器收到一个字符串:“end”,然后停止读取

在您的情况下,若要逐行从服务器读取数据,可以让一个循环不断读取数据,直到服务器发送“再见”。服务器可以在发送结果集的最后发送“再见”

       while(true){
            String receiveMessage = bufferedReader.readLine();//receive from server

            if(receiveMessage.equals("bye")) 
                break;

            System.out.println(receiveMessage); 
        }       

我仍然对json一无所知,所以我更喜欢另一种方法。明天,我将尝试在服务器上的hashmap中记住所有内容,然后将其发送到客户端。你不必非得这么做,它应该会起作用的。您只需要一个循环不断读取缓冲读取器,直到没有任何内容可读取为止。
       while(true){
            String receiveMessage = bufferedReader.readLine();//receive from server

            if(receiveMessage.equals("bye")) 
                break;

            System.out.println(receiveMessage); 
        }