как правильно построить клиент-сервер-бд?
у меня есть клиент через который пользователь может вводить и редактировать информацию в таблице, так же есть сервер который устанавливает соединение с БД и при надобности будет производить какие-то вычисление с данными. В случае клиент-бд всё просто, создаётся класс 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();
}
}
Как нужно передавать данные из сервера в клиент? Как между ними настроить связь ?