2012-06-04 3 views
1

스윙 및 최대 절전 모드 기능을 사용하는 응용 프로그램을 만들었으며 선생님은 Socket (내 대학의 숙제)을 사용하여 클라이언트/서버 통신을해야한다고 말했습니다. 예를 들어, 응용 프로그램이 다른 테이블에 대한 삽입/업데이트/삭제를 수행하고 있으며 사용자가 데이터를 쓰고 삽입/업데이트/삭제 버튼을 누른 후 JFrame을 사용하여 데이터베이스 변경을 수행하고 있습니다. 그러나 나는이 프로그램을 Socket을 사용하도록 변경하는 방법을 모른다. 클라이언트는 서버에서 메소드를 호출하는 actionperformed가있는 버튼이어야하며, 그러면 데이터베이스가 변경된 다음 클라이언트에 결과가 반환됩니까? 또는이 프로그램에서 소켓을 어떻게 사용해야합니까?내 경우 소켓을 사용하는 방법?

어쩌면 누군가가 어떤 아이디어로 나를 도울 수 있습니다. 미리 감사드립니다! 로 변경합니다 서버의 메소드를 호출 해, actionPerformed와 버튼으로 클라이언트에

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에 대한 언급이 없습니다. –

+0

저는 여러분이 서버/클라이언트 통신 프레임 워크를보고있을 것이라고 생각합니다. – krico

+0

@JimGarrison 나는 내 코드에서 Socket을 사용한다고 말하지 않았지만, 나는 그것이 숙제 인 것을 의미하고, 어떻게해야 하는지를 물었다. 소켓의 도움으로 서버/클라이언트 통신이 필요하기 때문에이 기능을 사용하기 위해 코드를 적용하는 방법을 모르겠습니다. 위에서 설명한 것처럼 클라이언트 (새로운 Java 파일)에서 actionperformed() 메서드를 이동하고 서버 (다른 Java 파일)에있는 메서드를 여기에서 호출하여 데이터베이스의 변경 사항을 확인한 다음 결과를 클라이언트에 반환합니다. 아니면 내 경우 소켓을 사용해야합니까? 누군가 아이디어가 있다면. – alin

답변

2

있다 : 여기

내가 스윙 및 최대 절전 모드를 사용하고 코드입니다 데이터베이스를 검색 한 다음 결과를 클라이언트에 반환합니다.

예. 그렇지만 메소드를 직접 호출하지는 않습니다 (RMI를 사용하지 않아도 됨). 선생님은 여러 클라이언트가 java 소켓을 통해 데이터베이스에서 작업 할 수있게 해주는 프로그램을 만들길 원합니다 (odbc를 사용하는 대신).

당신이 작성하지 않은 경우 자바 클라이언트 - 서버 프로그램이 전에 읽어 튜토리얼 : 이것은 불행하게도 코드에 많은 변화를 포함

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

, 예를 들어, 서버에 org.hibernate.Transaction tx = session.beginTransaction();이 있어야하고 IdFurnComboBox.getSelectedItem()이 클라이언트에 있어야합니다. 일반적으로 DB에 액세스하는 모든 것을 서버 프로그램에 배치 할 수 있으며 클라이언트의 사용자 (UI)와 관련된 모든 것을 배치 할 수 있습니다.

서버에는 클라이언트가 연결될 청취 소켓이 있어야합니다. 클라이언트는 서버에 명령을 전송합니다. GUI에서 선택된 항목은 서버에서 DB를 업데이트합니다.

+0

답변 해 주셔서 감사합니다. 정말 도움이되었습니다. :) – alin

관련 문제