1

我做了一个使用 Swing 和 Hibernate 设施的应用程序,我的老师告诉我,我必须使用 Socket 进行客户端/服务器通信(这是我大学的家庭作业)。例如,应用程序正在为不同的表执行插入/更新/删除,而我有一个 JFrame,用户正在其中写入数据,并且在按下插入/更新/删除按钮后,正在对数据库进行更改。但我真的不知道如何改变这个程序,以便它使用 Socket。在客户端上必须是具有执行操作的按钮,该按钮调用服务器上的方法,对数据库进行更改,然后将结果返回给客户端?或者我应该如何在这个程序中使用 Socket?

也许有人可以帮助我一些想法。提前致谢!

这是我使用 Swing 和 Hibernate 的代码:

public class AdaugaProdus extends javax.swing.JFrame {
private final Session session;

public AdaugaProdus() {
    session = HibernateUtil.getSessionFactory().openSession();
    initComponents();
    initComboBoxes();
}                       

private void initComboBoxes() {
    IdFurnComboBox.removeAllItems();
    IdCatComboBox.removeAllItems();
    IdRaftComboBox.removeAllItems();

    List<Furnizor> furnizori = session.createQuery("from Furnizor").list();
    for (Furnizor furnizor : furnizori)
        IdFurnComboBox.addItem(furnizor);

    List<Categorie> categorii = session.createQuery("from Categorie").list();
    for (Categorie categorie : categorii)
        IdCatComboBox.addItem(categorie);

    List<Istoricprod> rafturi = session.createQuery("from Istoricprod").list();
    for (Istoricprod raft : rafturi)
        IdRaftComboBox.addItem(raft);

}

private void InsereazaButtonActionPerformed(java.awt.event.ActionEvent evt)    {                                                
    runQueryBasedOnInsert();
}                                               

private void runQueryBasedOnInsert(){

try{
    org.hibernate.Transaction tx = session.beginTransaction();

    Produs produs = new Produs();

    int idFurn = ((Furnizor)IdFurnComboBox.getSelectedItem()).getIdfurn();
    Furnizor furnizor = new Furnizor(idFurn);
    produs.setFurnizor(furnizor);

    int idCat = ((Categorie)IdCatComboBox.getSelectedItem()).getIdcat();
    Categorie categorie = new Categorie(idCat);
    produs.setCategorie(categorie);

    int idRaft = ((Istoricprod)IdRaftComboBox.getSelectedItem()).getIdraft();
    Istoricprod istoricprod = new Istoricprod(idRaft);
    produs.setIstoricprod(istoricprod);

    produs.setDenumire(DenumireTextField.getText());
    produs.setCantitate(Integer.parseInt(CantitateTextField.getText()));
    produs.setUnitmas(UnitMasTextField.getText());

    session.save(produs);

    tx.commit();
  }
  catch(Exception e){
  System.out.println(e.getMessage());
  } 
   /*finally{
   session.close();
   }*/
   }

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new AdaugaProdus().setVisible(true);
        }
    });
}
4

1 回答 1

2

在客户端上必须是具有执行操作的按钮,该按钮调用服务器上的方法,对数据库进行更改,然后将结果返回给客户端?

是的,但它不直接调用该方法(您不应该使用 RMI)。你的老师希望你编写一个程序,允许多个客户端通过 java 套接字(而不是通过 odbc)在数据库上工作。

如果您在阅读这些教程之前从未用 Java 编写过客户端-服务器程序:

http://download.oracle.com/javase/tutorial/networking/sockets/

不幸的是,这涉及到对您的代码的许多更改,例如org.hibernate.Transaction tx = session.beginTransaction();必须在服务器上而IdFurnComboBox.getSelectedItem()必须在客户端上。根据经验,您可以将访问数据库的所有内容放在服务器程序中,并将与用户(UI)一起工作的所有内容放在客户端中。

服务器必须有一个侦听套接字,然后客户端连接到该套接字。客户端向服务器发送命令:在 GUI 中选择的项目,然后服务器更新数据库。

于 2012-06-04T07:03:19.737 回答