最近,Java課程設計要求實現一個ATM系統,我做的架構設計是RMI的C/S。
在部署的時候出了點問題。。。。
我的Server是部署在Linux (Ubuntu 7.04)上的,而Client是部署在Windows XP上,在做測試的時候Client總是報異常。
這裡先給出Server的主程式碼:package cn.edu.ynu.sei.atm.server;
import cn.edu.ynu.sei.atm.loginProcess.AvailableAccount;
import cn.edu.ynu.sei.atm.loginProcess.Verification;
import cn.edu.ynu.sei.atm.transactions.Transaction;
import cn.edu.ynu.sei.atm.account.CurrentAccount;
import cn.edu.ynu.sei.atm.account.DepositAccount;
import cn.edu.ynu.sei.atm.account.CreditAccount;
import java.rmi.Naming;
import java.io.IOException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/**
* ATM服務端<br>
* 該類提供了ATM系統的基本服務物件
* @author 88250
*/
public class ATMServer
{
/**
* 服務端程式進入點
* @param args 命令列參數,這裡為<code>null</code>
*/
public static void main(String[] args)
{
try
{
Verification verification= new Verification();
AvailableAccount availableAccountInfo = new AvailableAccount();
Transaction transaction = new Transaction();
CurrentAccount currentAccount = new CurrentAccount();
DepositAccount depositAccount = new DepositAccount();
CreditAccount creditAccount = new CreditAccount();
System.setProperty("java.rmi.server.hostname", "192.168.110.87");
LocateRegistry.createRegistry(1099);
Naming.bind("rmi://192.168.110.87:1099/CurrentAccount", currentAccount);
System.out.println("CurrentAccount ready!");
Naming.bind("rmi://192.168.110.87:1099/DepositAccount", depositAccount);
System.out.println("DepositAccount ready!");
Naming.bind("rmi://192.168.110.87:1099/CreditAccount", creditAccount);
System.out.println("CreditAccount ready!");
Naming.bind("rmi://192.168.110.87:1099/Transaction", transaction);
System.out.println("Transaction ready!");
Naming.bind("rmi://192.168.110.87:1099/Verification", verification);
System.out.println("Verification ready!");
Naming.bind("rmi://192.168.110.87:1099/AvailableAccount", availableAccountInfo);
System.out.println("AvailableAccount ready!");
System.out.print("ATM services ready....");
}
catch (RemoteException re)
{
re.printStackTrace();
}
catch (AlreadyBoundException abe)
{
abe.printStackTrace();
}
catch (IOException ioE)
{
ioE.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
看上去沒什麼問題,可是Client總說是服務被拒絕127.0.0.1。
後來發現是Server端的網路設定有問題。。。。
在Linux下,RMI的部署總是首先被映射在localhose,即127.0.0.1。
下面是解決方案:
編輯hosts檔案。sudo gedit /etc/hosts
添加:192.168.110.87 daniel-laptop #即 IP hostname
這下搞定了!
P.S. 聽說在Windows下部署Server不會出現上述問題。。。。