Comment puis-je retourner toutes les lignes d'un jeu de résultats à un client?

Joseph P .:

Je suis en train d'écrire une application java où le client envoie une requête et le serveur obtient le résultat et l'envoie au client

Le code est le suivant:


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


public class SqlClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",5000);
        BufferedReader bufferedReader =  new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);;
        String message;
        Connection connection;
        ResultSet resultSet;
        Statement stmt;
        Scanner scanner = new Scanner(System.in);
        message = scanner.nextLine();
        printWriter.println(message);
        System.out.println(bufferedReader.readLine());
        printWriter.flush();
        printWriter.close();
        bufferedReader.close();
    }
}

Comme vous pouvez le voir dans le code pour le serveur I sauvé les 3 colonnes de chaque ligne de 3 variables, puis a fait une chaîne et envoyé au client et il fonctionne, mais le client ne reçoit qu'une seule chaîne, si je mets le readline dans un boucle comment puis-je savoir quand arrêter? Dois-je faire un fil il est donc toujours à l'écoute? Je me demandais quelle était la meilleure façon de le faire, tout d'abord je voulais sérialisation mais il ResultSet ne met pas sérialisable; Donc, dois-je utiliser un tableau à deux dimensions? Si oui, quel est le code pour mettre tous les records à sa place?

Je cherchai partout mais je ne comprends pas quelle est la bonne façon de le faire, s'il vous plaît aider.

tang bob:

Que diriez-vous que vous itérer le jeu de résultats à partir du serveur, et de l'enregistrer dans une liste, et jsonify puis la liste sous forme de chaîne et de l'envoyer au client. Le client peut convertir la chaîne JSON à la liste à nouveau. il y a des bibliothèques peuvent être utilisées pour les conversions de JSON.

si vous ne pas l'idée de JSON, vous pouvez aussi essayer d'autres types de données existants. ou tout simplement créer votre propre type de données mise en œuvre du sérialisable que votre client et le serveur sont en java.

si votre volume de données est grande, vous pouvez contrôler du côté serveur sur le nombre d'enregistrements d'envoyer en une seule fois, par exemple 10000 par lot. chaque 10000, vous envoyer les données sous forme de chaîne JSON. Et votre client doit rester à l'écoute, jusqu'à ce qu'il lit quelque chose du serveur comme fin de la session entière, par exemple, vous recevez une chaîne de serveur: « fin », puis vous arrêter la lecture.

dans votre cas, si vous voulez lire ligne par ligne à partir du serveur, vous pouvez avoir une boucle continue à lire, jusqu'à ce que le serveur envoie « bye ». Et votre serveur peut envoyer « bye » à la fin, puis d'envoyer votre resultset

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

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

            System.out.println(receiveMessage); 
        }       

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=277933&siteId=1
conseillé
Classement