我制作了一个使用 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);
}
});
}
最佳答案
On the client has to be the button with the actionperformed that calls a method on the server, that makes changes to the database and then returns the result to the client?
是的,但它不会直接调用该方法(您不应该使用 RMI)。您的老师希望您编写一个程序,允许多个客户端通过 java 套接字(而不是通过 odbc)处理数据库。
如果您在阅读这些教程之前从未用 Java 编写过客户端-服务器程序:
http://download.oracle.com/javase/tutorial/networking/sockets/
不幸的是,这涉及到对代码的许多更改,例如org.hibernate.Transaction tx = session.beginTransaction();
必须位于服务器上,而 IdFurnComboBox.getSelectedItem()
必须位于客户端上。根据经验,您可以将访问数据库的所有内容放置在服务器程序中,并将与用户(UI)一起使用的所有内容放置在客户端中。
服务器必须有一个监听套接字,然后客户端可以连接到该监听套接字。客户端向服务器发送命令:在 GUI 中选择的项目,然后服务器更新数据库。
关于java - 在我的情况下如何使用 Socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10876661/