2015-04-19 1 views
0

Я пытаюсь создать распределенное приложение с Java RMI, и я много практиковал и изучал в этой области. Так много примеров работало отлично. Код здесь для серверной части, и при запуске приложения через cmd он не работает, но он отключается через 2-4 секунды, прежде чем он свяжет службу именно так, из-за этого Клиент дает «НЕБОЛЬШИЕ ИЗБИРАТЕЛЬСТВА» ». и сумасшедшая часть заключается в том, что один и тот же код работал очень плавно в приложении anthor.Мой серверный файл в Java RMI останавливается через 2-4 секунды после его запуска на NetBeans с помощью Win8

Вот все коды, которые я использую

RInterface.java

package rmi; 
import java.rmi.*; 
public interface RInterface extends Remote { 
public boolean log(String Uname, String code) throws RemoteException; 
} 

RClass.java

package rmi; 

import java.rmi.*; 
import java.rmi.server.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import javax.swing.JOptionPane; 

public class RClass extends UnicastRemoteObject implements RInterface { 

private Connection connect = null; 
private Statement statement = null; 
private ResultSet resultSet = null; 
private boolean stat = false; 
public String state = "Waiting Confirmation ..."; 

public RClass() throws RemoteException { 
    super(); 
    connect(); 
} 


public boolean log(String Uname, String code) throws RemoteException { 
    try { 
      String sql = "select name,code from logusers where name='"+Uname+"' and code ='"+code+"'"; 
      resultSet = statement.executeQuery(sql); 

      int count=0; 

      while (resultSet.next()) { 
       count+=1; 
      } 

      if (count==0) { 
       stat = false; 
       state = "NO User Found!! Access Denied"; 
      }else 
       if (count>1) { 
        stat = false; 
        state = "duplicate User!! NOT allowed"; 
       }else 
        if (count == 1){ 
         stat = true; 
         state = "WelCome "+ Uname +"!! Access Granted"; 
        } 
    } catch (SQLException e) { 
      JOptionPane.showMessageDialog(null,e); 
     } 
    return stat; 
} 

public final void connect(){ 
    try{ 
    Class.forName("com.mysql.jdbc.Driver"); 
    connect = DriverManager.getConnection("jdbc:mysql://localhost/eysa?"+"user=root&password="); 
    statement = connect.createStatement(); 

    } catch(ClassNotFoundException | SQLException e){ 
     System.exit(0); 
    } 
} 
} 

myServer.java (мой источник боли)

package rmi; 

import java.net.MalformedURLException; 
import java.rmi.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JOptionPane; 

public class myServer { 
myServer() { 
    new Thread(){ 
     public void run(){ 
      try{ 
       RInterface stub = new RClass(); 
       Naming.rebind("rmi://localhost/LOGIN",stub); 
      } catch(RemoteException e){ 
       JOptionPane.showMessageDialog(null, e); 
      } catch (MalformedURLException ex) { 
       Logger.getLogger(myServer.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }.start(); 
} 

public static void main(String[] args) throws InterruptedException { 
    myServer myS = new myServer(); 
    JOptionPane.showMessageDialog(null, "Server is Ready..."); 
} 
} 

myClient.java очень сим и я думаю, что нет необходимости присоединять его.

ответ

0

Очевидно, что вы покидаете vi, System.exit(), вызываете в свой иначе обработчик исключений.

Не пишите такой код. Когда вы поймаете исключение, распечатайте или запишите исключение или, еще лучше, трассировку стека. Тогда отладка не будет простой угадывающей игрой.

NB Одно соединение JDBC и одно заявление недостаточно для сервера RMI. RMI автоматически многопоточно. Для каждого удаленного вызова метода требуется соединение и оператор.