- 浏览: 23782 次
- 性别:
- 来自: 北京
最新评论
-
gyabooks:
releaseys 写道不能下载了,能不能发我邮箱啊 8436 ...
简单的Javascript日历源代码 -
releaseys:
不能下载了,能不能发我邮箱啊 843680960@qq.com ...
简单的Javascript日历源代码
我在上一篇文章中,简单地介绍了RMI的原理,这一篇文章我想在通过一个稍微复杂一点的例子,更好的向大家说明。读这篇文章需要你先参考我的上一篇文章: RMI(Remote Method Invocation)原理浅析。
例子中,用到了javaUI的swing和事件处理,以及线程知识,如果你对这方面的知识不是太清楚的话,希望你能参考一下资料,非常简单 !
例子的思想就是通过在远程启动服务,客户端提交任务,处理完以后,把结果反馈给客户端完成任务。程序的功能就是计算加减乘除, 有六个文件,分别为:
tools包是我自己写的一个工具包,辅助我来验证客户的输入,有关这个包中的文本验证和窗体居中显示,请你参考我的三片文章: 文本控件内容录入限制(含源代码说明)(一), Java 文本控件内容录入限制(含源代码说明)(二), Java窗体居中显示。由于源代码比较长,在这里就是简单的罗列了: AllCalculate.java,AllCalculateServer.java和MyRMIExam.java代码清单,如果你需要参考完整的源代码,请你到CSDN资源下载中心下载,文件名称为:MyRMI.rar(搜索下载, 我得源代码中使用的UTF-8的编码格式,工程是Eclipse),如果你有任何问题的话,请给我留言。
下面是程序运行的几幅演示图片,你可以在你的电脑上演示:
所在环境的文件结构,方便你的实验
Eclipse中的结构
在Eclipse中启动设置,注意此时需要先启动rmiregistry服务环境
客户端启动配置
如果你没有安装Eclipse,需要手动命令行启动
命令行启动客户端,注意此时client.policy放在exam目录下
图片中,小三角加感叹号是由于我使用恶java的SecurityManager,你可以在源代码中注释掉这个功能。
以下是几个程序源码清单:
- packagenet.csdn.blog.qb2049_xg;
- importjava.rmi.Remote;
- importjava.rmi.RemoteException;
- /**
- *AllCalculate.java
- *@authorUlyssesMa
- *@date2008-9-9
- *Remote在这里标识远程对象
- */
- publicinterfaceAllCalculateextendsRemote
- {
- //加
- publicfloatadd(floata,floatb)throwsRemoteException;
- //减
- publicfloatminus(floata,floatb)throwsRemoteException;
- //除
- publicfloatdiv(floata,floatb)throwsRemoteException;
- //乘
- publicfloatmul(floata,floatb)throwsRemoteException;
- }
*****************************************************************************
- packagenet.csdn.blog.qb2049_xg;
- importjava.rmi.AccessException;
- importjava.rmi.AlreadyBoundException;
- importjava.rmi.RemoteException;
- importjava.rmi.registry.LocateRegistry;
- importjava.rmi.registry.Registry;
- /**
- *AllCalculateServer.java
- *@authorUlyssesMa
- *@date2008-9-9
- */
- publicclassAllCalculateServer{
- publicstaticvoidmain(String[]args){
- try{
- //实现要导出的远程对象,它来完成运算(创建远程对象实例)
- AllCalculateImplallCalculate=newAllCalculateImpl();
- //获得本地的(RMI,要求是在rmiregistry启动情况下)注册表
- Registryrg=LocateRegistry.getRegistry();
- //实现对象的绑定,完成远程对象的注册工作
- rg.bind("allCalculate1",allCalculate);
- //状态提示
- System.out.println("实现所有方法的服务现在已成功启动!");
- }catch(NullPointerExceptionne){
- System.out.println("服务端出现了异常,可能是bind方法中name或是对象为空。\n"+ne.getMessage());
- }catch(AlreadyBoundExceptionabe){
- System.out.println("服务端出现了异常,可能是bind名字已被占用。\n"+abe.getMessage());
- }catch(AccessExceptionae){
- System.out.println("服务端出现了异常,可能是访问被拒绝。\n"+ae.getMessage());
- }catch(RemoteExceptionre){
- System.out.println("服务端出现了异常,可能是连接通信出现了问题。\n"+re.getMessage());
- }
- }
- }
************************************************************************************
- packagenet.csdn.blog.qb2049_xg;
- importjava.awt.BorderLayout;
- importjava.awt.Color;
- importjava.awt.Container;
- importjava.awt.GridBagConstraints;
- importjava.awt.GridBagLayout;
- importjava.awt.event.ActionEvent;
- importjava.awt.event.ActionListener;
- importjava.rmi.NotBoundException;
- importjava.rmi.RemoteException;
- importjava.rmi.registry.LocateRegistry;
- importjava.rmi.registry.Registry;
- importjavax.swing.JButton;
- importjavax.swing.JFrame;
- importjavax.swing.JLabel;
- importjavax.swing.JMenu;
- importjavax.swing.JMenuBar;
- importjavax.swing.JMenuItem;
- importjavax.swing.JOptionPane;
- importjavax.swing.JPanel;
- importjavax.swing.JScrollPane;
- importjavax.swing.JTextArea;
- importjavax.swing.JTextField;
- importjavax.swing.border.LineBorder;
- importnet.csdn.blog.qb2049_xg.tools.JTextHelp;
- importnet.csdn.blog.qb2049_xg.tools.MidScr;
- /**
- *MyRMIGui.java
- *@authorUlyssesMa
- *
- */
- publicclassMyRMIGuiextendsJFrameimplementsActionListener
- {
- //序列化标识使用
- privatestaticfinallongserialVersionUID=2049L;
- //窗体布局面板的定义
- privateJPaneltitle_p=newJPanel();
- privateJPanelbody_p=newJPanel();
- privateJPanelbottom_p=newJPanel();
- privateJTextFieldaddA_t,addB_t,minusA_t,minusB_t,divA_t,divB_t,mulA_t,mulB_t;
- privateJTextFieldaddResult_t,addServer_t,minusResult_t,minusServer_t,divResult_t,
- divServer_t,mulResult_t,mulServer_t,serviceAdd_t,serviceMinus_t,serviceMul_t,serviceDiv_t;
- //分
- privateServiceListFramelistFrame;
- //一些关键性部件声明
- privateJLabeltitle_l=newJLabel("<html><fontcolor=redsize=6>RMI加、减、乘、除实验</font></html>");
- privateJLabelexception_l=newJLabel("异常处理:");
- privateJTextAreaexception_ta=newJTextArea(10,70);
- //构造函数
- publicMyRMIGui()
- {
- //标题部分显示的设置
- title_p.setAlignmentX(JPanel.CENTER_ALIGNMENT);
- title_p.add(title_l);
- //主体部分的设置
- GridBagLayoutgbl1=newGridBagLayout();
- body_p.setLayout(gbl1);
- GridBagConstraintsc1=newGridBagConstraints();
- //表题说明
- JLabelnumberA,numberB,result,equal,operate,server,start,service;
- numberA=newJLabel("数A");
- numberA.setHorizontalAlignment(JLabel.CENTER);
- numberB=newJLabel("数B");
- numberB.setHorizontalAlignment(JLabel.CENTER);
- result=newJLabel("结果");
- result.setHorizontalAlignment(JLabel.CENTER);
- equal=newJLabel("等号");
- equal.setHorizontalAlignment(JLabel.CENTER);
- operate=newJLabel("操作符");
- operate.setHorizontalAlignment(JLabel.CENTER);
- server=newJLabel("服务器");
- server.setHorizontalAlignment(JLabel.CENTER);
- service=newJLabel("服务名称");
- service.setHorizontalAlignment(JLabel.CENTER);
- start=newJLabel("开始");
- start.setHorizontalAlignment(JLabel.CENTER);
- c1.fill=GridBagConstraints.VERTICAL;
- c1.gridx=0;
- c1.gridy=0;
- body_p.add(numberA,c1);
- c1.gridx=1;
- body_p.add(operate,c1);
- c1.gridx=2;
- body_p.add(numberB,c1);
- c1.gridx=3;
- body_p.add(equal,c1);
- c1.gridx=4;
- body_p.add(result,c1);
- c1.gridx=5;
- body_p.add(server,c1);
- c1.gridx=6;
- body_p.add(service,c1);
- c1.gridx=7;
- body_p.add(start,c1);
- //加运算UI
- addA_t=newJTextField(10);
- addB_t=newJTextField(10);
- newJTextHelp(addA_t,JTextHelp.NUMBER).insertCheck();
- newJTextHelp(addB_t,JTextHelp.NUMBER).insertCheck();
- addResult_t=newJTextField(10);
- serviceAdd_t=newJTextField(10);
- addServer_t=newJTextField(15);
- JButtonaddStart_b=newJButton("开始计算");
- addStart_b.addActionListener(this);
- addStart_b.setActionCommand("add");
- JLabeladd_l=newJLabel("+");
- add_l.setHorizontalAlignment(JLabel.CENTER);
- JLabeladdEqual_l=newJLabel("=");
- addEqual_l.setHorizontalAlignment(JLabel.CENTER);
- c1.gridx=0;
- c1.gridy=1;
- body_p.add(addA_t,c1);
- c1.gridx=1;
- body_p.add(add_l,c1);
- c1.gridx=2;
- body_p.add(addB_t,c1);
- c1.gridx=3;
- body_p.add(addEqual_l,c1);
- c1.gridx=4;
- body_p.add(addResult_t,c1);
- c1.gridx=5;
- body_p.add(addServer_t,c1);
- c1.gridx=6;
- body_p.add(serviceAdd_t,c1);
- c1.gridx=7;
- body_p.add(addStart_b,c1);
- //减运算UI
- minusA_t=newJTextField(10);
- minusB_t=newJTextField(10);
- newJTextHelp(minusA_t,JTextHelp.NUMBER).insertCheck();
- newJTextHelp(minusB_t,JTextHelp.NUMBER).insertCheck();
- minusResult_t=newJTextField(10);
- minusServer_t=newJTextField(15);
- serviceMinus_t=newJTextField(10);
- JButtonminusStart_b=newJButton("开始计算");
- minusStart_b.addActionListener(this);
- minusStart_b.setActionCommand("minus");
- JLabelminus_l=newJLabel("-");
- minus_l.setHorizontalAlignment(JLabel.CENTER);
- JLabelminusEqual_l=newJLabel("=");
- minusEqual_l.setHorizontalAlignment(JLabel.CENTER);
- c1.gridx=0;
- c1.gridy=2;
- body_p.add(minusA_t,c1);
- c1.gridx=1;
- body_p.add(minus_l,c1);
- c1.gridx=2;
- body_p.add(minusB_t,c1);
- c1.gridx=3;
- body_p.add(minusEqual_l,c1);
- c1.gridx=4;
- body_p.add(minusResult_t,c1);
- c1.gridx=5;
- body_p.add(minusServer_t,c1);
- c1.gridx=6;
- body_p.add(serviceMinus_t,c1);
- c1.gridx=7;
- body_p.add(minusStart_b,c1);
- //除运算UI
- divA_t=newJTextField(10);
- divB_t=newJTextField(10);
- newJTextHelp(divA_t,JTextHelp.NUMBER).insertCheck();
- newJTextHelp(divB_t,JTextHelp.NUMBER).insertCheck();
- divResult_t=newJTextField(10);
- divServer_t=newJTextField(15);
- serviceDiv_t=newJTextField(10);
- JButtondivStart_b=newJButton("开始计算");
- divStart_b.setActionCommand("div");
- divStart_b.addActionListener(this);
- JLabeldiv_l=newJLabel("÷");
- div_l.setHorizontalAlignment(JLabel.CENTER);
- JLabeldivEqual_l=newJLabel("=");
- divEqual_l.setHorizontalAlignment(JLabel.CENTER);
- c1.gridx=0;
- c1.gridy=3;
- body_p.add(divA_t,c1);
- c1.gridx=1;
- body_p.add(div_l,c1);
- c1.gridx=2;
- body_p.add(divB_t,c1);
- c1.gridx=3;
- body_p.add(divEqual_l,c1);
- c1.gridx=4;
- body_p.add(divResult_t,c1);
- c1.gridx=5;
- body_p.add(divServer_t,c1);
- c1.gridx=6;
- body_p.add(serviceDiv_t,c1);
- c1.gridx=7;
- body_p.add(divStart_b,c1);
- //乘运算UI
- mulA_t=newJTextField(10);
- mulB_t=newJTextField(10);
- newJTextHelp(mulA_t,JTextHelp.NUMBER).insertCheck();
- newJTextHelp(mulB_t,JTextHelp.NUMBER).insertCheck();
- mulResult_t=newJTextField(10);
- mulServer_t=newJTextField(15);
- serviceMul_t=newJTextField(10);
- JButtonmulStart_b=newJButton("开始计算");
- mulStart_b.addActionListener(this);
- mulStart_b.setActionCommand("mul");
- JLabelmul_l=newJLabel("×");
- mul_l.setHorizontalAlignment(JLabel.CENTER);
- JLabelmulEqual_l=newJLabel("=");
- mulEqual_l.setHorizontalAlignment(JLabel.CENTER);
- c1.gridx=0;
- c1.gridy=4;
- body_p.add(mulA_t,c1);
- c1.gridx=1;
- body_p.add(mul_l,c1);
- c1.gridx=2;
- body_p.add(mulB_t,c1);
- c1.gridx=3;
- body_p.add(mulEqual_l,c1);
- c1.gridx=4;
- body_p.add(mulResult_t,c1);
- c1.gridx=5;
- body_p.add(mulServer_t,c1);
- c1.gridx=6;
- body_p.add(serviceMul_t,c1);
- c1.gridx=7;
- body_p.add(mulStart_b,c1);
- //状态初始化
- addResult_t.setEditable(false);
- minusResult_t.setEditable(false);
- mulResult_t.setEditable(false);
- divResult_t.setEditable(false);
- //异常问题的处理
- GridBagLayoutgbl=newGridBagLayout();
- bottom_p.setLayout(gbl);
- GridBagConstraintsc=newGridBagConstraints();
- c.fill=GridBagConstraints.NONE;
- c.gridx=0;
- c.gridy=0;
- bottom_p.add(exception_l,c);
- c.gridx=5;
- JButtonclear_b=newJButton("清空");
- clear_b.addActionListener(this);
- clear_b.setActionCommand("clear");
- bottom_p.add(clear_b,c);
- exception_ta.setBorder(newLineBorder(newColor(0,0,0)));
- exception_ta.setLineWrap(true);
- JScrollPanescrollPane=newJScrollPane(exception_ta);
- c.fill=GridBagConstraints.HORIZONTAL;
- c.gridx=0;
- c.gridy=1;
- c.gridwidth=6;
- bottom_p.add(scrollPane,c);
- //设置菜单栏
- JMenuBarjmb=newJMenuBar();
- JMenuhelp_m=newJMenu("帮助");
- JMenuItemlistService=newJMenuItem("浏览已注册的服务");
- listService.addActionListener(this);
- listService.setActionCommand("list");
- JMenuItemexit=newJMenuItem("退出");
- exit.addActionListener(this);
- exit.setActionCommand("exit");
- help_m.add(listService);
- help_m.add(exit);
- jmb.add(help_m);
- //加载面板
- this.setJMenuBar(jmb);
- Containerrp=this.getContentPane();
- rp.add(title_p,BorderLayout.NORTH);
- rp.add(body_p,BorderLayout.CENTER);
- rp.add(bottom_p,BorderLayout.SOUTH);
- //设置窗体展示宽度
- this.setSize(800,450);
- //设置显示位置
- MidScrms=newMidScr(this);
- this.setLocation(ms.getX(),ms.getY());
- //设置标题
- this.setTitle("测试JavaRMI的使用问题");
- //关闭点击后的处理
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- this.setVisible(true);
- this.validate();
- }
- //事件的处理
- publicvoidactionPerformed(ActionEvente)
- {
- //add,minus,div,mulcommands
- exception_ta.setForeground(newColor(255,0,0));
- //加事件的处理
- if(e.getActionCommand().equals("add"))
- {
- Stringarg1=addA_t.getText().trim();
- Stringarg2=addB_t.getText().trim();
- Stringhost=addServer_t.getText().trim();
- Stringservice=serviceAdd_t.getText().trim();
- if(arg1.equals("")&&arg2.equals(""))
- {
- JOptionPane.showMessageDialog(this,"参与计算的两个数字不能为空,请检查你的输入,谢谢!",
- "远程调用",JOptionPane.INFORMATION_MESSAGE);
- return;
- }
- newThread(newLoadRMI(host,arg1,arg2,service,e.getActionCommand())).start();
- }
- //减事件的处理
- if(e.getActionCommand().equals("minus"))
- {
- Stringarg1=minusA_t.getText().trim();
- Stringarg2=minusB_t.getText().trim();
- Stringhost=minusServer_t.getText().trim();
- Stringservice=serviceMinus_t.getText().trim();
- if(arg1.equals("")&&arg2.equals(""))
- {
- JOptionPane.showMessageDialog(this,"参与计算的两个数字不能为空,请检查你的输入,谢谢!",
- "远程调用",JOptionPane.INFORMATION_MESSAGE);
- return;
- }
- newThread(newLoadRMI(host,arg1,arg2,service,e.getActionCommand())).start();
- }
- //乘事件的处理
- if(e.getActionCommand().equals("mul"))
- {
- Stringarg1=mulA_t.getText().trim();
- Stringarg2=mulB_t.getText().trim();
- Stringhost=mulServer_t.getText().trim();
- Stringservice=serviceMul_t.getText().trim();
- if(arg1.equals("")&&arg2.equals(""))
- {
- JOptionPane.showMessageDialog(this,"参与计算的两个数字不能为空,请检查你的输入,谢谢!",
- "远程调用",JOptionPane.INFORMATION_MESSAGE);
- return;
- }
- newThread(newLoadRMI(host,arg1,arg2,service,e.getActionCommand())).start();
- }
- //除事件的处理
- if(e.getActionCommand().equals("div"))
- {
- Stringarg1=divA_t.getText().trim();
- Stringarg2=divB_t.getText().trim();
- Stringhost=divServer_t.getText().trim();
- Stringservice=serviceDiv_t.getText().trim();
- if(arg1.equals("")&&arg2.equals(""))
- {
- JOptionPane.showMessageDialog(this,"参与计算的两个数字不能为空,请检查你的输入,谢谢!",
- "远程调用",JOptionPane.INFORMATION_MESSAGE);
- return;
- }
- newThread(newLoadRMI(host,arg1,arg2,service,e.getActionCommand())).start();
- }
- //清理文本框按钮事件
- if(e.getActionCommand().equals("clear")){
- exception_ta.setText("");
- }
- //退出菜单事件处理
- if(e.getActionCommand().equals("exit")){
- System.exit(HIDE_ON_CLOSE);
- }
- //查看注册服务菜单事件
- if(e.getActionCommand().equals("list")){
- if(listFrame==null)
- listFrame=newServiceListFrame();
- else
- listFrame.setVisible(true);
- }
- }
- //完成各种方法调用,在这里使用了多线程的方法,可以多个任务同时的进行,不会有等待的感觉
- classLoadRMIimplementsRunnable
- {
- Stringhost,arg1,arg2,service;
- StringactionCommand;
- publicLoadRMI(Stringhost,Stringarg1,Stringarg2,Stringservice,StringactionCommand){
- this.arg1=arg1;
- this.arg2=arg2;
- this.host=host;
- this.service=service;
- this.actionCommand=actionCommand;
- }
- publicvoidrun(){
- try{
- //如果host的值是null的话,那么系统就默认调用本地远程方法
- Registryrg=LocateRegistry.getRegistry(host);
- AllCalculateac=(AllCalculate)rg.lookup(service);
- floata=Float.valueOf(arg1).floatValue();
- floatb=Float.valueOf(arg2).floatValue();
- //根据事件名称调用方法
- if(this.actionCommand.equals("add")){
- addResult_t.setText(String.valueOf(ac.add(a,b)));
- }
- if(this.actionCommand.equals("minus")){
- minusResult_t.setText(String.valueOf(ac.minus(a,b)));
- }
- if(this.actionCommand.equals("mul")){
- mulResult_t.setText(String.valueOf(ac.mul(a,b)));
- }
- if(this.actionCommand.equals("div")){
- divResult_t.setText(String.valueOf(ac.div(a,b)));
- }
- }catch(NullPointerExceptionnpe){
- exception_ta.append("调用的服务名称为空"+npe.getMessage()+"\n");
- }catch(NotBoundExceptionnbe){
- exception_ta.append("调用的服务不存在,请检查你的输入"+nbe.getMessage()+"\n");
- }
- catch(RemoteExceptionre){
- exception_ta.append("调用远程方法时出现了问题,情况可能是:"+re.getMessage()+"\n");
- }
- }
- }
- }
如果你对这个小例子感兴趣的话,请你到CSDN资源中心下载!
相关推荐
在Java 7源代码中,这个目录下可能包含了Oracle提供的各种服务和框架,如JDBC驱动、RMI(远程方法调用)服务等。 4. **launcher**: 这个部分涉及到Java应用程序的启动器,它是Java虚拟机(JVM)的入口点。Java 7...
首先,让我们来看看主要的源代码文件: 1. **RMIChatServerImpl.java**:这是服务器端的核心实现类,它实现了RMI服务的接口。通常,我们需要定义一个接口,比如`RMIChatServer`,并在实现类`RMIChatServerImpl`中...
- **基于Java的视频会议系统源代码**: 包含了项目的全部源代码,可以深入研究各个模块的实现细节,对于学习Java开发和视频会议系统构建具有很高的参考价值。 这个项目提供了一个完整的Java视频会议系统实现,对...
而“java手机游戏(堡垒)的设计与开发(源代码+论文)”文件很可能是项目源代码的存放地,以及开发者撰写的关于设计思路、技术实现和经验总结的学术论文,这对于学习游戏开发的初学者来说是一份宝贵的资源。 总的来说...
这本书的源代码是学习MFC的宝贵资料,涵盖了MFC的许多核心概念和技术。 在提供的压缩包文件中,尽管文件名看似与MFC无关,但它们可能是书中各个章节的示例代码或辅助资源。下面我们将逐一解析这些文件可能涉及的MFC...
在"java-remote-control"这个压缩包中,可能包含了实现上述步骤的源代码示例,包括远程接口定义、服务器端对象实现、客户端调用逻辑等。通过学习这些示例,你可以更深入地理解Java如何实现远程控制功能,并可以参考...
本篇文章将聚焦于JDK10的源码,通过对源代码的深入剖析,揭示其背后的运行机制与设计理念。 首先,我们关注到的是`java.base`模块,它是Java平台标准版(Java SE)的核心部分,包含了基础的API,如数学运算、字符串...
学习这个源代码,开发者可以深入理解Java网络编程、多线程、数据库操作以及UI设计等多个核心领域,对于提升个人技能和参与类似项目的开发具有极大的帮助。同时,这也是一个很好的实践案例,能够帮助初学者将理论知识...
- **项目创建与管理**:讲解如何在Eclipse中创建新的Java项目,以及如何管理项目的源代码和资源文件。 - **调试技巧**:介绍使用Eclipse进行代码调试的基本方法。 ##### 3. 面向对象编程 (Lesson3) - **类与对象的...
通过分析RemoteControl的源代码,开发者不仅可以学习到Java RMI和JMX的使用,还能了解到网络编程、并发控制、安全策略以及GUI设计等多个方面的知识。这对于提升Java编程技能和理解分布式系统的工作原理非常有帮助。
- 源代码文件:.cs或.vb文件,分别对应C#或Visual Basic.NET的源代码。 - 项目文件:.csproj或.vbproj,定义了项目的结构和编译设置。 - 数据库文件:可能有SQLite、SQL Server或其他数据库的连接字符串和脚本。 - ...
8. **Java反序列化工具**:如"java反序列化利用程序UI版Beta1.1"这样的工具,可能是为了帮助安全研究人员测试和理解反序列化漏洞的工作原理,通过图形用户界面(GUI)提供了一种更直观的方式来实验和分析Java反序列...
在这个项目的源代码"**BatalhaNavalJavaRMI-master**"中,我们可以深入研究RMI的具体实现,包括接口定义、远程对象的实现、服务器启动和客户端连接的代码,以及如何处理并发和网络通信的问题。通过分析这些代码,...
3. **完整的源代码**:源代码是整个项目的灵魂,包括了所有的类、方法和逻辑,开发者可以通过阅读源代码学习到JBuilder开发的具体实现。 通过这个项目,开发者可以学习到如何利用JBuilder进行Java应用开发,以及...
这个压缩包包含了PowerBuilder 8.0用于开发分布式应用的示例源代码,是学习和理解PowerBuilder如何处理分布式系统的一个宝贵资源。在深入探讨这些知识点之前,先了解一下PowerBuilder 8.0的核心特点: 1. **数据...
7. **JFace视图和编辑器**:视图和编辑器是Eclipse工作台的核心概念,源代码可能展示了如何创建和管理这些组件,以提供不同的功能区域。 8. **对话框和提示**:JFace提供了方便的对话框类,如MessageDialog、...
- **Tiny RMI远程调用**:RMI(Remote Method Invocation)是一种允许对象通过网络请求另一个对象上的方法调用的机制,Tiny RMI可能是对其的一种封装或增强。 #### 5. 性能优化与缓存管理 - **J2Cache缓存框架**:...
在源代码结构中,我们可以期待看到以下几个关键文件: - 客户端代码:可能包含AndroidManifest.xml(应用配置),MainActivity.java(主活动)以及网络通信相关的类。 - 服务器端代码:可能有main.cpp(主程序),...
- **注解**:在源代码中添加元数据的方式,用于各种目的如文档、编译时检查和代码处理。 - **自动装箱和拆箱**:自动将基本类型转换为包装类或反之。 - **枚举类**:提供了一种有限且固定数量的对象实例的方法。 ...
源代码组织清晰,遵循良好的编程实践,便于后续维护与扩展。系统成功上线后,实现了预期的功能,即实时监控汽车供应链中托盘的位置信息,并通过仪表板形式直观展示。 #### 七、总结 本文详细介绍了如何使用JBoss、...