2012-06-04 22 views
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); 
     } 
    }); 
} 
+0

爲什麼你認爲你需要一個Socket?你知道一個Socket是用來做什麼的嗎?您當前的代碼中沒有提到Socket。 –

+0

我想你可能正在尋找一個服務器/客戶端通信框架。 – krico

+0

@JimGarrison我沒有說我在我的代碼中使用Socket,我的意思是我必須(這是一個家庭作業),我問我該怎麼做。我不知道如何調整我的代碼來使用這個工具,因爲我需要藉助套接字來進行服務器/客戶端通信。就像我在上面的帖子中所說的那樣:在客戶端中移動actionperformed()方法(一個新的Java文件)並從這裏調用位於服務器(另一個Java文件)中的方法是一個好主意,數據庫中的更改並將結果返回給客戶端?或者我應該如何在我的情況下使用套接字?如果有人有想法。 – alin

回答

2

在客戶端必須與調用服務器上的方法的actionPerformed,使更改按鈕數據庫,然後將結果返回給客戶端?

是的,但它不直接調用方法(您不希望使用RMI)。你的老師希望你創建一個允許多個客戶端通過java套接字(而不是通過說odbc)來處理數據庫的程序。

如果你從來沒有用Java編寫的客戶端 - 服務器程序前閱讀這些教程:

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

這涉及到了許多修改你的代碼不幸的是,如org.hibernate.Transaction tx = session.beginTransaction();必須在服務器上,而IdFurnComboBox.getSelectedItem()必須在客戶端上。作爲一個經驗法則,您可以將訪問數據庫的所有內容放在服務器程序中,以及與客戶端中的用戶(用戶界面)一起工作的所有內容。

服務器必須有一個監聽套接字,然後客戶端才能連接到該套接字。客戶端向服務器發送命令:在GUI中選擇的項目,然後服務器更新數據庫。

+0

謝謝你的回答。它真的幫助了我。:) – alin

相關問題