2012-06-04 24 views
1

Я сделал приложение, которое использует средства Swing и Hibernate, и мой учитель сказал мне, что мне нужно сделать связь Client/Server с помощью Socket (это домашняя работа для моего университета). Например, приложение выполняет вставку/обновление/удаление для разных таблиц, и у меня есть JFrame, где пользователь записывает данные, и после нажатия кнопки вставки/обновления/удаления делаются изменения в базе данных. Но я действительно не знаю, как изменить эту программу, чтобы она использовала Socket. На клиенте должна быть кнопка с actionperformed, которая вызывает метод на сервере, который вносит изменения в базу данных и затем возвращает результат клиенту? Или как использовать Socket в этой программе?Как использовать гнездо в моем случае?

Возможно, кто-то может помочь мне с некоторыми идеями. Заранее спасибо!

Вот код, где я использую Свинг и 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. –

+0

Я думаю, что вы можете искать структуру взаимодействия с сервером и клиентом. – krico

+0

@JimGarrison Я не сказал, что использую Socket в своем коде, я имел в виду, что мне нужно (это домашнее задание), и я спросил, как я могу это сделать. Я не знаю, как адаптировать мой код для использования этого средства, потому что мне нужна связь между сервером и клиентом с помощью Sockets. Как я уже сказал в публикации выше: Хорошая идея переместить метод actionperformed() в клиенте (новый файл Java) и вызвать отсюда метод, который находится на сервере (другой файл Java), что делает изменения в базе данных и возвращает результат клиенту? Или как я должен использовать Socket в моем случае? если у кого-то есть идея. – alin

ответ

2

На клиенте должна быть кнопка с actionperformed, который вызывает метод на сервере, который вносит изменения в базы данных и затем возвращает результат клиенту?

Да, но он не вызывает метод напрямую (вы не должны использовать RMI). Ваш учитель хочет, чтобы вы создали программу, которая позволяет нескольким клиентам работать с базой данных через java-сокеты (а не через odbc).

Если вы никогда не писали программу клиент-сервер в Java, прежде чем прочитать эти учебники:

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

Это включает много изменений в код, к сожалению, например, org.hibernate.Transaction tx = session.beginTransaction(); должен быть на сервере, а IdFurnComboBox.getSelectedItem() должен быть на клиенте. Как правило, вы можете разместить все, что обращается к БД в серверной программе, и все, что работает с пользователем (пользовательский интерфейс) в клиенте.

На сервере должен быть слуховой сокет, к которому затем подключаются клиент (ы). Клиенты отправляют команды на сервер: элементы, которые выбраны в графическом интерфейсе, затем сервер обновляет базу данных.

+0

Благодарим вас за ответ. Это действительно помогло мне. :) – alin