posted @ 2012-11-25 07:27 from [FreedomShe]
分布式课程的作业据说是百年不变——在我老板还是学生的时候就已经是这个题目了。网上一搜一大堆类似代码,喜欢自己写代码,自己去研究探索学习,作业不难,记录下来给某人做参考。1. Java界面开发环境: Eclipse + Swing
2. RMI简介
3. 代码结构
1. Java界面开发环境: Eclipse + Swing
Java GUI 工具包主要有AWT, SWT, Swing三种(技术出现先后顺序),用Swing开发界面,代码还是很简洁的。IDE一般选择NetBeans或者Eclipse+插件,如今WindowBuilder被Google收购以后免费了,直接集成在了Eclipse IDE for Java Developers内,下载即可进行Java界面可视化开发。
Eclipse IDE for Java Developers-Eclipse Juno (4.2) SR1 Packages,下载(只有Eclipse IDE for Java Developers包含WindowBuilder,Eclipse IDE for Java EE Developers等版本均不包含WindowBuilder组件)。
参考:NetBeans VS Eclipse 开发SWT Swing应用
例程开发时Java版本:1.7.0_09
2. RMI简介
RMI即远程调用,它的介绍太多了。通俗点讲,这个过程就是服务器端实例化一个类,然后客户端可以通过RMI绑定IP和端口来调用服务器端的这个实例的方法或变量,就如同这个实例是在客户端一样(实例是在服务器端运行)。客户端通过RMI与服务器端通信只需要知道:服务器端的IP和端口,客户端注册的实例的类的接口。以本地IP为例编程实现简单RMI的一般步骤为:
1). 服务器端实例化一个类,并将其绑定在一个端口上(建立远程对象注册表,注册实例名等);
2). 客户端实例化一个接口(服务器端被调用实例的那个接口,客户端需要预先获得接口定义),而符合该接口定义的实例则是通过RMI远程获得。
3). 客户端可以远程调用符合这个接口定义的实例了。
最简单的RMI例程参考:Java RMI之HelloWorld篇
3. 代码结构
本例程的代码结构很清晰,共5个类,IService, ServiceImlp, RmiServer, RmiClient, ServerFrame, ClientFrame。他们的关系如下图:
可以看到,客户端程序包括IService, RmiClient, ClientFrame三个类,RmiClient封装了RMI远程调用相关的操作;ClientFrame则封装是客户端界面,也是程序的入口;IService是服务器端提供RMI服务的实例的接口类(如同C/C++里面调用一个dll,需要预先知道dll提供导出函数的头文件)。服务器端包括IService, ServiceImlp, RmiServer, ServerFrame四个类,IService前面已讲;ServiceImpl是IService的实现类,服务器端提供服务的实例就是由这个类实例化得到的;RmiServer是服务器端提供RMI服务操作的封装;ServerFrame则封装服务器端的界面。
IService为服务器端提供服务类实例的接口文件,服务器端必须拥有该接口文件的一个实现类ServiceImlp,最后提供服务的实例就由ServiceImpl实例化;客户端也必须知道该接口文件,以便将RMI实例转换为IService实例使用。
package services; import java.rmi.Remote; import java.rmi.RemoteException; /** * 服务接口,客户端调用接口,服务端实现接口 * @author yuanboshe */ public interface IService extends Remote { String getDateStr() throws RemoteException; String getMessage() throws RemoteException; }
package server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.text.SimpleDateFormat; import java.util.Date; import services.IService; /** * 服务接口的实现 * @author yuanboshe */ public class ServiceImpl extends UnicastRemoteObject implements IService { private static final long serialVersionUID = 9076175201315559196L; public String message = ""; protected ServiceImpl() throws RemoteException { super(); } @Override public String getDateStr() throws RemoteException { return new SimpleDateFormat("yy-MM-dd hh:mm:ss").format(new Date()); } @Override public String getMessage() throws RemoteException { return message; } }
RmiServer是服务器端提供RMI服务的类,这里提供了绑定和取消绑定两个方法(取消绑定后客户端任然可以访问已经申请过的实例,但是不能再申请新的实例)。
package server; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; /** * 服务端RMI封装װ * @author Yuanbo She */ public class RmiServer { public Registry registry; public ServiceImpl service; /** * 启动RMI服务,需要定义本地IP监听端口 * @param port �˿ں� * @return */ public String bindService(String port) { try { if (registry != null && registry.list().length > 0) { return "Service already have bound!"; } service = new ServiceImpl(); registry = LocateRegistry.createRegistry(Integer.parseInt(port)); registry.rebind("service", service); return "Binding sucess!"; } catch (Exception e) { e.printStackTrace(); return "Error:\n" + e.getMessage(); } } /** * 取消绑定,但是客户端还能继续使用已经绑定的服务端实例,只是不能绑定新的实例 * @return */ public String unbindService() { try { if (registry == null || registry.list().length == 0) { return "No service have bound!"; } registry.unbind("service"); UnicastRemoteObject.unexportObject(registry, true); return "Unbinding sucess!"; } catch (Exception e) { e.printStackTrace(); return "Error:\n" + e.getMessage(); } } }
RmiClient封装了客户端的RMI操作
package client; import java.rmi.Naming; import java.rmi.RemoteException; import services.IService; /** * 客户端RMI封装 * @author yuanboshe */ public class RmiClient { IService service; public String setService(String ip, String port) { try { if (service == null) { String url = String.format("rmi://%s:%s/service", ip, port); service = (IService) Naming.lookup(url); return "Getting service sucess!"; } return "Service already exist!"; } catch (Exception e) { e.printStackTrace(); return "Binding failed!\n" + e.getMessage(); } } public void initService() { service = null; } public String callGetDateStr() throws RemoteException { if (service == null) { return null; } return service.getDateStr(); } public String callGetMessage() throws RemoteException { if (service == null) { return null; } return service.getMessage(); } }
ServerFrame和ClientFrame分别为服务器端和客户端的界面类,均集成自JFrame,Swing界面编写大体结构类似,一个main函数作为程序入口点,构造函数初始化界面,自己添加一些案件响应函数即可。本例中两个界面类均加入了一个定时器,server端定时器用于刷新时间,client端定时器用于向server端发送调用消息。安装Eclipse IDE for Java Developers后,用WindowBuilder Editor打开继承自JFrame的java文件(Eclipse里右键.java文件,选择Open with WindowBuilder Editor)即可进行可视化界面设计。
package server; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JTextField; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import java.awt.Font; import java.awt.Color; import javax.swing.JTextPane; /** * 服务端界面 * @author yuanboshe */ public class ServerFrame extends JFrame { private static final long serialVersionUID = -4596135066244941170L; private JPanel contentPane; private JTextField txtIp; private JTextField txtPort; private JLabel labelTime; private JTextPane txtpnMessage; private final String TIME_FORMAT = "yy-MM-dd hh:mm:ss"; private RmiServer rmiServer; private JTextField txtIntelMessage; private Timer updateDateTimer; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { ServerFrame frame = new ServerFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public ServerFrame() { setResizable(false); setTitle("RMI\u670D\u52A1\u7AEF"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 363, 386); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BorderLayout(0, 0)); JPanel panel = new JPanel(); contentPane.add(panel); GridBagLayout gbl_panel = new GridBagLayout(); gbl_panel.columnWidths = new int[] { 100, 100, 100, 0 }; gbl_panel.rowHeights = new int[] { 30, 30, 30, 30, 0, 80, 30, 0 }; gbl_panel.columnWeights = new double[] { 1.0, 1.0, 1.0, Double.MIN_VALUE }; gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE }; panel.setLayout(gbl_panel); JLabel lblip = new JLabel("\u672C\u673AIP\u5730\u5740\uFF1A"); GridBagConstraints gbc_lblip = new GridBagConstraints(); gbc_lblip.insets = new Insets(0, 0, 5, 5); gbc_lblip.anchor = GridBagConstraints.EAST; gbc_lblip.gridx = 0; gbc_lblip.gridy = 0; panel.add(lblip, gbc_lblip); String ip; try { ip = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e1) { e1.printStackTrace(); ip = "localhost"; } txtIp = new JTextField(); txtIp.setEditable(false); txtIp.setText(ip); GridBagConstraints gbc_txtIp = new GridBagConstraints(); gbc_txtIp.gridwidth = 2; gbc_txtIp.insets = new Insets(0, 0, 5, 0); gbc_txtIp.fill = GridBagConstraints.HORIZONTAL; gbc_txtIp.gridx = 1; gbc_txtIp.gridy = 0; panel.add(txtIp, gbc_txtIp); txtIp.setColumns(20); JLabel label_port = new JLabel("\u8981\u7ED1\u5B9A\u7684\u7AEF\u53E3\u53F7\uFF1A"); GridBagConstraints gbc_label_port = new GridBagConstraints(); gbc_label_port.insets = new Insets(0, 0, 5, 5); gbc_label_port.anchor = GridBagConstraints.EAST; gbc_label_port.gridx = 0; gbc_label_port.gridy = 1; panel.add(label_port, gbc_label_port); txtPort = new JTextField(); txtPort.setText("1099"); GridBagConstraints gbc_txtPort = new GridBagConstraints(); gbc_txtPort.gridwidth = 2; gbc_txtPort.insets = new Insets(0, 0, 5, 0); gbc_txtPort.fill = GridBagConstraints.HORIZONTAL; gbc_txtPort.gridx = 1; gbc_txtPort.gridy = 1; panel.add(txtPort, gbc_txtPort); txtPort.setColumns(20); JButton btnReset = new JButton("\u91CD\u7F6E"); btnReset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { resetAction(e); } }); GridBagConstraints gbc_btnReset = new GridBagConstraints(); gbc_btnReset.insets = new Insets(0, 0, 5, 5); gbc_btnReset.gridx = 0; gbc_btnReset.gridy = 2; panel.add(btnReset, gbc_btnReset); JButton btnStart = new JButton("\u542F\u52A8\u670D\u52A1"); btnStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startServerAction(e); } }); GridBagConstraints gbc_btnStart = new GridBagConstraints(); gbc_btnStart.insets = new Insets(0, 0, 5, 5); gbc_btnStart.anchor = GridBagConstraints.NORTH; gbc_btnStart.gridx = 1; gbc_btnStart.gridy = 2; panel.add(btnStart, gbc_btnStart); JButton btnStop = new JButton("\u505C\u6B62\u670D\u52A1"); btnStop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { stopServerAction(e); } }); GridBagConstraints gbc_btnStop = new GridBagConstraints(); gbc_btnStop.insets = new Insets(0, 0, 5, 0); gbc_btnStop.gridx = 2; gbc_btnStop.gridy = 2; panel.add(btnStop, gbc_btnStop); JLabel label = new JLabel("\u5411\u5BA2\u6237\u7AEF\u53D1\u9001\u4FE1\u606F\uFF1A"); GridBagConstraints gbc_label = new GridBagConstraints(); gbc_label.gridwidth = 3; gbc_label.anchor = GridBagConstraints.WEST; gbc_label.insets = new Insets(0, 0, 5, 5); gbc_label.gridx = 0; gbc_label.gridy = 3; panel.add(label, gbc_label); txtIntelMessage = new JTextField(); GridBagConstraints gbc_txtIntelMessage = new GridBagConstraints(); gbc_txtIntelMessage.gridwidth = 2; gbc_txtIntelMessage.insets = new Insets(0, 0, 5, 5); gbc_txtIntelMessage.fill = GridBagConstraints.HORIZONTAL; gbc_txtIntelMessage.gridx = 0; gbc_txtIntelMessage.gridy = 4; panel.add(txtIntelMessage, gbc_txtIntelMessage); txtIntelMessage.setColumns(10); JButton btnSendMessage = new JButton("\u53D1\u9001"); btnSendMessage.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { rmiServer.service.message = txtIntelMessage.getText(); } }); GridBagConstraints gbc_btnSendMessage = new GridBagConstraints(); gbc_btnSendMessage.insets = new Insets(0, 0, 5, 0); gbc_btnSendMessage.gridx = 2; gbc_btnSendMessage.gridy = 4; panel.add(btnSendMessage, gbc_btnSendMessage); labelTime = new JLabel(TIME_FORMAT); labelTime.setForeground(new Color(0, 51, 255)); labelTime.setFont(new Font("Times New Roman", Font.BOLD, 30)); GridBagConstraints gbc_labelTime = new GridBagConstraints(); gbc_labelTime.fill = GridBagConstraints.VERTICAL; gbc_labelTime.insets = new Insets(0, 0, 5, 0); gbc_labelTime.gridwidth = 3; gbc_labelTime.gridx = 0; gbc_labelTime.gridy = 5; panel.add(labelTime, gbc_labelTime); txtpnMessage = new JTextPane(); txtpnMessage.setEditable(false); txtpnMessage.setText("Message..."); txtpnMessage.setFont(new Font("Times New Roman", Font.ITALIC, 14)); txtpnMessage.setForeground(new Color(255, 0, 0)); GridBagConstraints gbc_txtpnMessage = new GridBagConstraints(); gbc_txtpnMessage.gridwidth = 3; gbc_txtpnMessage.fill = GridBagConstraints.BOTH; gbc_txtpnMessage.gridx = 0; gbc_txtpnMessage.gridy = 6; panel.add(txtpnMessage, gbc_txtpnMessage); } /** * 设置定时器任务 * @author Yuanbo She */ protected class MyTimerTask extends TimerTask { @Override public void run() { String time = new SimpleDateFormat(TIME_FORMAT).format(Calendar.getInstance().getTime()); labelTime.setText(time); } } private void startTimer() { if (updateDateTimer == null) { updateDateTimer = new Timer(); } updateDateTimer.scheduleAtFixedRate(new MyTimerTask(), new Date(), 800); } private void stopTimer() { if (updateDateTimer != null) { updateDateTimer.cancel(); updateDateTimer = null; } } public void startServerAction(ActionEvent e) { if (rmiServer == null) { rmiServer = new RmiServer(); } txtpnMessage.setText(rmiServer.bindService(txtPort.getText())); startTimer(); } public void stopServerAction(ActionEvent e) { if (rmiServer == null) { txtpnMessage.setText("Bound nothing, please start service first!"); return; } txtpnMessage.setText(rmiServer.unbindService()); stopTimer(); } public void resetAction(ActionEvent e) { txtIp.setText("localhost"); txtPort.setText("1099"); txtpnMessage.setText("Message..."); txtIntelMessage.setText(""); rmiServer.service.message = ""; } }
package client; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JTextField; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.Font; import java.awt.Color; import java.rmi.RemoteException; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import javax.swing.JTextPane; /** * 客户端界面 * @author yuanboshe */ public class ClientFrame extends JFrame { private static final long serialVersionUID = 4640407835597561733L; private JPanel contentPane; private JTextField txtIp; private JTextField txtPort; private JLabel lblTime; private JTextPane txtPnMessage; private RmiClient rmiClient; private JTextField txtIntelMessage; private Timer timer; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { ClientFrame frame = new ClientFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public ClientFrame() { setResizable(false); setTitle("RMI\u5BA2\u6237\u7AEF"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 377, 399); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BorderLayout(0, 0)); JPanel panel = new JPanel(); contentPane.add(panel); GridBagLayout gbl_panel = new GridBagLayout(); gbl_panel.columnWidths = new int[] { 120, 120, 120, 0 }; gbl_panel.rowHeights = new int[] { 30, 30, 30, 30, 30, 80, 0, 0 }; gbl_panel.columnWeights = new double[] { 0.0, 1.0, 1.0, Double.MIN_VALUE }; gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE }; panel.setLayout(gbl_panel); JLabel lblip = new JLabel("\u670D\u52A1\u5668IP\uFF1A"); GridBagConstraints gbc_lblip = new GridBagConstraints(); gbc_lblip.insets = new Insets(0, 0, 5, 5); gbc_lblip.anchor = GridBagConstraints.EAST; gbc_lblip.gridx = 0; gbc_lblip.gridy = 0; panel.add(lblip, gbc_lblip); txtIp = new JTextField(); txtIp.setText("localhost"); GridBagConstraints gbc_txtIp = new GridBagConstraints(); gbc_txtIp.gridwidth = 2; gbc_txtIp.insets = new Insets(0, 0, 5, 0); gbc_txtIp.fill = GridBagConstraints.HORIZONTAL; gbc_txtIp.gridx = 1; gbc_txtIp.gridy = 0; panel.add(txtIp, gbc_txtIp); txtIp.setColumns(20); JLabel label_port = new JLabel("\u670D\u52A1\u5668\u7AEF\u53E3\u53F7\uFF1A"); GridBagConstraints gbc_label_port = new GridBagConstraints(); gbc_label_port.insets = new Insets(0, 0, 5, 5); gbc_label_port.anchor = GridBagConstraints.EAST; gbc_label_port.gridx = 0; gbc_label_port.gridy = 1; panel.add(label_port, gbc_label_port); txtPort = new JTextField(); txtPort.setText("1099"); GridBagConstraints gbc_txtPort = new GridBagConstraints(); gbc_txtPort.gridwidth = 2; gbc_txtPort.insets = new Insets(0, 0, 5, 0); gbc_txtPort.fill = GridBagConstraints.HORIZONTAL; gbc_txtPort.gridx = 1; gbc_txtPort.gridy = 1; panel.add(txtPort, gbc_txtPort); txtPort.setColumns(20); JButton btnStart = new JButton("\u8FDE\u63A5\u670D\u52A1\u5668\u5E76\u542F\u52A8"); btnStart.addActionListener(new BtnStartAction()); JButton btnReset = new JButton("\u91CD\u7F6E\u6D88\u606F"); btnReset.addActionListener(new BtnResetAction()); GridBagConstraints gbc_btnReset = new GridBagConstraints(); gbc_btnReset.insets = new Insets(0, 0, 5, 5); gbc_btnReset.gridx = 0; gbc_btnReset.gridy = 2; panel.add(btnReset, gbc_btnReset); GridBagConstraints gbc_btnStart = new GridBagConstraints(); gbc_btnStart.gridwidth = 2; gbc_btnStart.insets = new Insets(0, 0, 5, 0); gbc_btnStart.gridx = 1; gbc_btnStart.gridy = 2; panel.add(btnStart, gbc_btnStart); JLabel label = new JLabel("\u670D\u52A1\u5668\u4F20\u6765\u7684\u4FE1\u606F\uFF1A"); GridBagConstraints gbc_label = new GridBagConstraints(); gbc_label.anchor = GridBagConstraints.EAST; gbc_label.insets = new Insets(0, 0, 5, 5); gbc_label.gridx = 0; gbc_label.gridy = 3; panel.add(label, gbc_label); txtIntelMessage = new JTextField(); txtIntelMessage.setEditable(false); GridBagConstraints gbc_txtIntelMessage = new GridBagConstraints(); gbc_txtIntelMessage.gridwidth = 2; gbc_txtIntelMessage.insets = new Insets(0, 0, 5, 5); gbc_txtIntelMessage.fill = GridBagConstraints.HORIZONTAL; gbc_txtIntelMessage.gridx = 1; gbc_txtIntelMessage.gridy = 3; panel.add(txtIntelMessage, gbc_txtIntelMessage); txtIntelMessage.setColumns(10); JLabel label_1 = new JLabel("\u670D\u52A1\u5668\u540C\u6B65\u6765\u7684\u65F6\u95F4\uFF1A"); GridBagConstraints gbc_label_1 = new GridBagConstraints(); gbc_label_1.anchor = GridBagConstraints.WEST; gbc_label_1.gridwidth = 3; gbc_label_1.insets = new Insets(0, 0, 5, 5); gbc_label_1.gridx = 0; gbc_label_1.gridy = 4; panel.add(label_1, gbc_label_1); lblTime = new JLabel("yy-MM-dd hh:mm:ss"); lblTime.setForeground(new Color(0, 51, 255)); lblTime.setFont(new Font("Times New Roman", Font.BOLD, 30)); GridBagConstraints gbc_lblTime = new GridBagConstraints(); gbc_lblTime.insets = new Insets(0, 0, 5, 0); gbc_lblTime.gridwidth = 3; gbc_lblTime.gridx = 0; gbc_lblTime.gridy = 5; panel.add(lblTime, gbc_lblTime); txtPnMessage = new JTextPane(); txtPnMessage.setText("Message..."); txtPnMessage.setForeground(Color.RED); txtPnMessage.setFont(new Font("Times New Roman", Font.ITALIC, 14)); txtPnMessage.setEditable(false); GridBagConstraints gbc_txtPnMessage = new GridBagConstraints(); gbc_txtPnMessage.gridwidth = 3; gbc_txtPnMessage.fill = GridBagConstraints.BOTH; gbc_txtPnMessage.gridx = 0; gbc_txtPnMessage.gridy = 6; panel.add(txtPnMessage, gbc_txtPnMessage); rmiClient = new RmiClient(); } protected class BtnResetAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { lblTime.setText("yy-MM-dd hh:mm:ss"); txtIp.setText("localhost"); txtPort.setText("1099"); } } protected class BtnStartAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { txtPnMessage.setText(rmiClient.setService(txtIp.getText(), txtPort.getText())); // 增加定时器 if (timer == null) { timer = new Timer(); } timer.scheduleAtFixedRate(new MyTimerTask(), new Date(), 1000); } } // 定时器定时执行的任务 protected class MyTimerTask extends TimerTask { @Override public void run() { try { lblTime.setText(rmiClient.callGetDateStr()); txtIntelMessage.setText(rmiClient.callGetMessage()); } catch (RemoteException e) { e.printStackTrace(); timer.cancel(); timer = null; rmiClient.initService(); txtPnMessage.setText("Error:\n" + e.getMessage()); } } } }
以上是全部源码,按照services, client, server三包结构存放即可。
相关推荐
用RMI显示分布式环境中服务器的时钟。客户机通过IP地址连接服务器,获得服务器的本地时间,然后显示在客户端中。时间可分为模拟时钟和数字时钟两种模式。并不断刷新。
综上所述,"RMI分布式会议系统"的实践不仅涉及到RMI技术的运用,还涵盖了用户界面设计、并发编程、安全性以及系统测试等多个方面,是Java开发中的一个综合实战项目。通过这样的实践,开发者可以深入理解分布式系统的...
5. **分布式会议系统设计**:在本项目中,可能包括用户登录、创建会议、加入会议、发言、投票等功能。这些功能可能通过多个分布式组件实现,如会议管理服务器、用户代理和服务代理等。 6. **JVM间通信**:RMI使用...
在IT行业中,Spring框架与RMI(Remote Method Invocation,远程方法调用)的结合是构建分布式系统的一种常见方式。这个“spring和RMI分布式整合源码”可能包含了一个实际项目中如何将这两种技术融合的实例。现在,...
5. **RMI注册表**:作为服务的目录,RMI注册表(rmiregistry)是RMI系统的关键组件。服务器启动时,它会将`AgendaServiceImpl`注册到指定的端口,客户端可以通过指定的URL找到并连接到这个服务。 6. **安全性与并发...
总的来说,这个"RMI分布式议程服务"示例提供了一个学习和实践RMI的实用案例,涵盖了分布式系统的基础操作,如远程对象注册、调用以及日程管理业务逻辑的实现。对于深入理解Java RMI技术,以及如何构建分布式应用程序...
综上所述,基于Java RMI的分布式数据库系统在设计与应用中,充分利用了Java语言的特点和RMI通信机制的优势,为实现高效、可靠、可扩展的分布式数据库系统提供了坚实的基础。随着技术的不断进步,分布式数据库系统的...
从金融行业的银行联网、交通行业的售票系统、公安系统的全国户籍管理等等,这些企业或行业单位之间地理分布性或业务分布性,使得一个企业或行业拥有多个网络服务器,如何在这种分布式的网络环境下实现高效的数据库...
"基于Java RMI的分布式数据库系统开发与应用.pdf" 本资源主要介绍基于Java RMI的分布式数据库系统的开发与应用。Java RMI(Remote Method Invocation)是一种远程方法调用机制,允许不同的系统和节点之间的数据交互...
使用Java RMI创建一个分布式议程共享服务。不同的用户可以使用这个共享议程服务执行查询、添加和删除会议的操作。服务器支持会议的登记和清除等功能; 议程共享服务包括以下功能:用户注册、添加会议、查询会议、...
总结一下,这个Java分布式系统架构源码包提供了一个全面的学习和实践机会,涵盖了Java分布式系统的关键技术,如RMI、JMS和EJB。通过深入研究源码,开发者可以理解如何设计和实现这样的系统,以及如何利用像Jeesuite...
而分布式这个关键词揭示了RMI框架在开发分布式系统中的应用,即通过RMI可以将不同的系统组件连接起来,无论它们物理上是否分布在不同主机上。 总之,Java RMI技术是开发Java分布式网络应用的一个核心工具,它简化了...
系统设计可能如下: 1. 当设备发出告警时,触发客户端调用RMI客户端(RMIClient)。 2. RMIClient查询RMI服务器(RMIServer)获取告警信息。 3. RMIServer调用相应的业务处理接口。 4. 告警信息存入数据库。 5. 最后,...
1. 只支持Java:由于RMI是Java特有的,它无法与其他语言的系统进行互操作。 2. 性能限制:RMI依赖于Java对象的序列化,这可能导致性能开销。 3. 安全性:RMI需要谨慎配置以防止恶意攻击,如代码注入。 综上所述,...
基于Java—RMI分布式技术的应用研究 1. RMI概述 RMI(Remote Method ...RMI可以应用于各种分布式系统,例如分布式计算、分布式数据库、分布式文件系统等。RMI也可以应用于Java EE平台,例如EJB、Servlet等。
这种RMI分布式消息传送模型为构建大型分布式系统提供了一种高效、灵活的通信机制,能够适应不同场景的需求,如电力系统中的不同模块间的交互。通过RMI,开发者可以轻松地在分布式环境中实现跨JVM的方法调用,简化了...
**基于RMI的分布式议程服务详解** 远程方法调用(Remote Method Invocation,RMI)是Java平台中用于实现分布式计算的一种技术。它允许在不同的Java虚拟机(JVM)之间进行对象方法的调用,使得开发分布式应用程序变...
分布式原理与源码是IT领域中的重要主题,它涉及到如何构建可扩展、高可用和高性能的大型软件系统。本文将深入探讨分布式系统的基本概念、原理以及相关书籍中的关键知识点。 首先,分布式系统是由多台独立的计算机...