как правильно построить клиент-сервер-бд?

у меня есть клиент через который пользователь может вводить и редактировать информацию в таблице, так же есть сервер который устанавливает соединение с БД и при надобности будет производить какие-то вычисление с данными. В случае клиент-бд всё просто, создаётся класс Connection в нём функции с SQL запросами в БД. И потом функции от-туда вызываются в Controller(я на JavaFX делаю), но как мне это реализовать в клиент-сервер-бд ?

У меня есть главный класс вот его код:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javax.swing.JOptionPane;


public class FXMain extends Application  {
    
    @Override
    public void start(Stage primaryStage) throws IOException {
       Parent root = FXMLLoader.load(getClass().getResource("FXML.fxml"));
             
        Scene scene = new Scene(root, 1200, 700);
        
        primaryStage.setTitle("Information");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

   
    public static void main(String[] args) {
        //new Thread(new Server()).start();//????
        launch(args);
    }

    
    
}

Есть контролер в котором я попытался подключится к серверу

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import static javafx.application.Application.launch;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.Initializable;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeItem;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTreeTableCell;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.util.converter.IntegerStringConverter;
import javafx.scene.control.TablePosition;
import javafx.scene.input.InputMethodEvent;
import javafx.scene.input.MouseEvent;
import javafx.event.ActionEvent;
import javax.swing.JOptionPane;


public class FXMLController implements Initializable, Runnable {

    
    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;
    
    @FXML
    private Button button_add;

    @FXML
    private Button button_delate;

    @FXML
    private Button button_edit;

    @FXML
    private Button button_save;

    @FXML
    private Button button_v;

    @FXML
    private Button button_v1;
    
    @FXML
    private TableColumn<info, String> col_brand;

    @FXML
    private TableColumn<info, String> col_color;

    @FXML
    private TableColumn<info, Integer> col_id;

    @FXML
    private TableColumn<info, String> col_type;

    @FXML
    private TableColumn<info, Float> col_value;

    @FXML
    private TableColumn<info, Float> col_volume;

    @FXML
    private TableView<info> table_info;
    
    @FXML
    private TextField textfield_brand;

    @FXML
    private TextField textfield_color;
    
    @FXML
    private TextField textfield_color1;

    @FXML
    private TextField textfield_id;

    @FXML
    private TextField textfield_o;

    @FXML
    private TextField textfield_type;

    @FXML
    private TextField textfield_value;

    @FXML
    private TextField textfield_volume;
    
    static private Socket connection;
    static private ObjectOutputStream output;
    static private ObjectOutputStream output1;
    static private ObjectInputStream input;
    static private ObjectInputStream input1;
    @FXML
    void text_change(InputMethodEvent event) {

    }
    //
    @FXML
    void Select(ActionEvent event) {
     
    }
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        new Thread(new Server()).start();//
        
        TableView<info> table = new TableView<info>();
        table.setEditable(true);
        
        col_id.setCellValueFactory(new PropertyValueFactory<info,Integer>("id"));
        col_brand.setCellValueFactory(new PropertyValueFactory<info,String>("brand"));
        col_color.setCellValueFactory(new PropertyValueFactory<info,String>("color"));
        col_type.setCellValueFactory(new PropertyValueFactory<info,String>("type"));
        col_volume.setCellValueFactory(new PropertyValueFactory<info,Float>("volume"));
        col_value.setCellValueFactory(new PropertyValueFactory<info,Float>("value"));
        
        
    }   
    
    @Override
    public void run (){
        try {
            while(true){
                connection = new Socket(InetAddress.getByName("127.0.0.1"), 5678);
                
                
            }
        } catch (IOException ex) {
       
        }
    }

    private static void sendData(Object obj, Object obj1){
        
    
    
    }
}

И есть код сервера в котором я уже пытался установить соединение с БД и прописать необходимые функции с SQL запросами:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

import java.sql.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javax.swing.JOptionPane;
import java.sql.ResultSet;


public class Server extends Thread {
    Connection conn = null;
    static private ServerSocket server;
    static private Socket connection;
    static private ObjectOutputStream output;
    static private ObjectOutputStream output1;
    static private ObjectInputStream input;
    static private ObjectInputStream input1;
   
    @Override
    public void run (){
        try {
            server = new ServerSocket(5678, 10);
           
            while(true){
                connection = server.accept();
                System.out.println("Connection accepted");  
                
               
            }
        } catch (IOException ex) {
        //} catch (ClassNotFoundException ex) {
        }
    }
   
   
        
        //private PreparedStatement pstmt;
        
   
    public static Connection ConnectDb() {
            try{
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/info","root", "Mzzzzzzzzz78!");;
        //JOptionPane.showMessageDialog(null,"ConnectionEstablished");
        return conn;
    }catch(Exception e){
        JOptionPane.showMessageDialog(null, e);
        return null;
}
    
    }
    public static ObservableList<info> getDatainfo(){
        Connection conn = ConnectDb();
        ObservableList<info> list = FXCollections.observableArrayList();
        try{
            PreparedStatement ps = conn.prepareCall("select * from automoto.auto");
            ResultSet rs = ps.executeQuery();
            
            while(rs.next()){
                list.add(new info(Integer.parseInt(rs.getString("id")),rs.getString("brand"), rs.getString("type"), rs.getString("color"), Float.parseFloat(rs.getString("volume")),Float.parseFloat(rs.getString("value"))  ));            
            }         
        }catch(Exception e){  
        }
        return list;
    }
    public static ObservableList<info> getNewInfo(String query){
        Connection conn = ConnectDb();
        ObservableList<info> list = FXCollections.observableArrayList();
        try{
            PreparedStatement ps = conn.prepareCall(query);
            ResultSet rs = ps.executeQuery();
            
            while(rs.next()){
                list.add(new info(Integer.parseInt(rs.getString("id")),rs.getString("brand"), rs.getString("type"), rs.getString("color"), Float.parseFloat(rs.getString("volume")),Float.parseFloat(rs.getString("value"))  ));            
            }         
        }catch(Exception e){  
        }
        return list;
    }
    public void saveData(String query){
        try{
            Connection conn = ConnectDb();
            PreparedStatement pstmt = conn.prepareStatement(query);
            pstmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String args[])
    {
        new Server();

    }
}

Как нужно передавать данные из сервера в клиент? Как между ними настроить связь ?


Ответы (0 шт):