学习JavaFX Script,第二部分:使用RMI进行远程通信

5 篇文章 0 订阅
       原文地址:  http://java.sun.com/developer/technicalArticles/scripting/javafxpart2/

       本系列的第一部分向Java程序员介绍了JavaFX脚本编程语言的语法及语义。本文在您对JavaFX脚本认知的基础上进行描述,调用Java平台的远程方法调用(Remote Method Invocation,Java RMI)类库,使JavaFX图形用户界面(GUI)可以远程通信。在JavaFX脚本中使用RMI是非常直接的,使用简单快捷的方式就可以完成演示和测试客户端-服务器功能。
        
        在NetBeans中新建一个JavaFX脚本工程(Creating a JavaFX Script Project in the NetBeans IDE)

        首先,在 NetBeans集成开发环境(IDE)5.5.1中新建一个JavaFX Scrip工程,如果你还从来没有这样做过,那就一定要阅读一下这篇优秀的文章《 Getting Started With JavaFX Script Language (for Swing Programmers)》,里面有详细的描述。然而,如果你了解这些方式,并且已经从Netbeans Beta Update Center 下载并安装了JavaFX模块,那么你将会明白这里总结的重点。
        1、从NetBeans的主菜单中选择File菜单,接着选择Net Project。
        2、在New Project向导对话框中,在Categories面板中选择General,在Project面板中选择Java Application。点击Next。
        3、在Project Name域中输入 JavaFXClient
        4、在Project Location中,点击Browse,然后指定存储工程的位置。
        5、取消对Set as Main Project和Create Main Class复选框的选择,然后点击Finish。
        现在,使用IDE创建一个名为HelloServer的JavaFX Script文件。
        1、在Projects窗口中,右键点击JavaFXClient > Source Packages节点,选择New > File/Folder。
        2、在Categories面板中,选择Other,接着在File Types面板中,选择JavaFX File。然后点击Next。现在,当你在Projects窗口中调用主工程节点的New或者Source Packages节点时,JavaFX文件类型应该出现在可用的文件类型列表中。
        3、在New JavaFX File向导中的Name and Location页中,File Name中输入 MyClient,Folder域中输入 src/client。注意,现在新建的文件名会出现在Created File域中。
        4、点击Finish完成工程的新建。
        5、在Projects窗口中,右键点击JavaFXClient节点,选择Properties。
        6、在Properties对话框的Categories面板中,选择Run。
        7、在Arguments域中输入脚本的名称: client.MyClient,点击OK。
        此时将会在JavaFXClient工程的client目录中创建一个名为 MyClient.fx的空JavaFX Script文件。此时,让这个文件为空,接着设置项目的另外一部分——完成RMI服务器的设置后将重新返回这里。

        使用远程方法调用(RMI)进行客户端--服务器通信(Client-Server Communication with Remote Method Invocation(RMI))

        Java远程方法调用(Java RMI)是用来实现远程等价对象调用的Java应用程序接口(API)。使用RMI开发分布式程序比用socket要简单,因为开发者不需要定义协议,而定义协议往往是消耗时间又容易出错的工作。
        使用RMI,开发者有从本地类文件调用本地方法的假象,其实,参数被发送到远程目标并被解释,然后结果又被发送回调用者。因为JavaFX Script可以调用Java对象,所有RMI就是一个让JavaFX客户端进行远程通信的既快捷又简单的工具。
        使用RMI开发一个分布式JavaFX Script程序包含一下步骤:
         1、 定义一个远程接口。
         2、 实现远程接口。
         3、 开发服务器。
         4、 使用Java开发一个针对JavaFX Script的连接助手。
         5、 创建一个调用上述连接助手的JavaFX Script客户端。
         本文作者压缩了前三步,它们来自于Qusay Mahmoud的优秀文章《 Distributed Java Programming With RMI and CORBA》,因为它们和RMI的传统Java实现没有区别。最后两步针对JavaFX Script做了修改。然而,在你深入每一步时,你需要为服务器新建一个NetBeans IDE工程。
        在NetBeans中,按如下步骤操作:
        1、从File菜单中选择New Project。应该可以看到类似图1的一个对话框。
在NetBeans IDE5.5.1中新建一个工程
                       图1  在NetBeans5.5.1 中新建一个工程
        2、在Categories列表中,选择General。在Projects列表中,选择Java Application。点击Next。应该可以看到一个类似图2的对话框。
在NetBeans IDE中自定义新工程
                   图2  在NetBeans IDE中自定义新工程
        3、在Project Name中输入 JavaRMIServer。选择适当的文件夹保存项目,然后取消对Set as Main Project的选择。最后,点击Finish按钮。这就创建了一个名为JavaRMIServer的Java工程。

        定义一个远程接口(Define a Remote Interface)
        现在,在server包中创建一个名为 ServerInterface的Java接口,如代码示例1所示。接口 ServerInterface包含了一个方法, ping(),它获取一个 String参数,返回一个 hello加上该参数组成的字符串。
        代码示例1
package  server;

import  java.rmi.Remote;
import  java.rmi.RemoteException;

public   interface  ServerInterface  extends  Remote  {

    
public String ping(String fileName) throws
        RemoteException;

}
       和任何一个RMI程序一样,ServerInterface必须符合下述要求:
       1、必须继承 Remote接口。
       2、为了客户端可以加载一个实现了 Remote接口的远程对象,必须声明为 public
       3、接口中的每一个方法(本例中只包含了一个方法)必须抛出 java.rmi.RemoteException

        实现远程接口(Implement  the Remote Interface)
       接下来的步骤是创建一个实现了 ServerInterface的类。一个示例实现如代码示例2所示。注意,除了实现 ServerInterface外,ServerImpl类还要继承 UnicasRemoteObject。这说明ServerImpl类是用来创建一个单一的、不可复制的远程对象,它使用RMI默认的TCP传输进行通信。这可能是无论任何时候使用RMI时需要做的所有事情。
        示例代码2
package  server;

import  java.io. * ;
import  java.rmi. * ;
import  java.rmi.server.UnicastRemoteObject;

public   class  ServerImpl  extends  UnicastRemoteObject
    
implements  ServerInterface  {

    
private String name;

    
public ServerImpl() throws RemoteException{
        
super();
    }


    
public String ping(String s){
        
return "Hello " + s;
    }


}

         开发服务器(Develop the Server)
        第三步是开发服务器。这个类将成为服务器程序的入口,因为它包含了main()方法。服务器必须完成以下三个任务:
        1、创建RMI注册处(RMI registry)。
        2、创建一个远程的实例——本例中,是ServerImpl。
        3、注册使用RMI注册处创建的对象。
        一个示例实现如代码示例3所示。
        代码示例3
package  server;

import  java.rmi. * ;
import  java.rmi.registry.LocateRegistry;

public   class  ServerMain  {

    
public static void main(String argv[]) {

        
try {

            LocateRegistry.createRegistry(
1099);

            ServerInterface s 
= new ServerImpl();
            Naming.rebind(
"//127.0.0.1/Server", s);

        }
 catch(Exception e) {
            System.out.println(
"Server: "+e.getMessage());
            e.printStackTrace();
        }

    }

}
         Naming.rebind("//127.0.0.1/Server", s)语句假设RMI注册处运行在默认的端口上,即代码示例3中在 LocateRegistry.createRegistry()语句定义的1099端口。可是,如果RMI注册处运行在不同的端口上——例如,更改注册位置创建语句为 LocateRegistry.createRegistry(4500)——那么你就要相应地将绑定语句过更改为:
Naming.rebind( " //127.0.0.1:4500/Server " , s)
        另外,特别需要注意的是,地址 127.0.0.1是一个专用的 localhost地址,它假定RMI注册位置和服务器运行在同一台机器上。如果它们不是运行在同一台机器上,只需要简单的更改 rebind()方法中的地址,和RMI注册处的IP地址相适应。
        
         使用Java开发一个针对JavaFX Script的连接助手(Develop a Java Technology-Based Connection Helper for JavaFX Script)
         接下来步骤是在JavaFXClient工程中完成的,它和传统RMI程序不同:现在必须创建一个Java连接助手。这个连接助手远程调用远程接口—— ServerInterface——中指定任何方法,然后把结果返回到调用它的JavaFX Script。为了完成这个任务,连接助手首先需要从RMI注册处获得远程对象的引用。一旦获得了引用,就可以调用适当的方法。
        代码示例4中给出了实现。注意,这只是一个简单的静态方法,通过它JavaFX Script可以获得远程ServerInterfacde的实现对象的引用。
        代码示例4
package  client;

import  java.rmi. * ;
import  server.ServerInterface;

public   class  ConnectionHelper  {

    
public static ServerInterface getConnection()
        
throws Exception
    
{
        
return (ServerInterface)
            Naming.lookup(
"rmi://127.0.0.1:1099/Server");
    }


}

        再一次需要注意,这段代码假定RMI注册处和客户端运行在同一台机器上。如果不是这样,修改IP地址——如果需要,同时修改端口——使二者匹配。
        一旦把这些信息输入到NetBeans IDE工程中,你可能想弄明白这个工程是如何访问在JavaRMIServer工程创建的ServerInterface类的。理论上讲,在客户端和服务器端工程之间共享了一个包含RMI接口的独立JAR文件,或者建立了一个动态类的加载机制——关于此后是如何操作的更多信息参考技术提示中的“Dynamic Class Loading in RMI”部分。
        然而,为了简单期间,你可以只完成其中的一个:
        1、复制ServerInterface的源文件到JavaFXClient工程的client中。
        2、修改JavaFXClient工程的属性,使其包含JavaRMIProject工程。
        无论使用哪种方式,都要在源码顶部中增加适当的导入语句,如代码示例4所示。

        创建调用连接助手的JavaFX Script客户端(Create the JavaFX Script Client That Class Upon the Connection Helper)
        最后,代码示例5给出了尅用来创建JavaFX Script客户端的代码,该客户端通过RMI和远程服务器通信。将代码示例5中的代码复制到MyClient.fx文件中。
        代码示例5

import  java.lang. * ;
import  javafx.ui. * ;
import  java.rmi. * ;

import  server.ServerInterface;
import  client.ConnectionHelper;


class  ButtonClickModel  {
    attribute numClicks: Number;
}


var model 
=   new  ButtonClickModel();

var win 
=  Frame  {
    width: 
200
    content: GridPanel 
{
        border: EmptyBorder 
{
           top: 
30
           left: 
30
           bottom: 
30
           right: 
30
        }

        rows: 
3
        columns: 
1
        vgap: 
10
        cells:
          [  Button 
{
                 text: 
"Click to make RMI connection!"
                 mnemonic: I
                 action: operation() 
{

                     
try {

                         var remoteServer:ServerInterface 
=
                             ConnectionHelper.getConnection();

                         var results 
= remoteServer.ping("Test");
                         System.out.println(
"response: {results}");
                         model.numClicks
++;

                     }
 catch (e:Exception) {
                         System.out.println(
"exception: {e}");
                     }

                 }

             }
,

             Label 
{
                 text: bind 
"Number of RMI connections: {model.numClicks}"

             }

          ]
    }

    visible: 
true
}
;

         现在,编译和运行服务端工程。接着,运行客户端工程。应该可以看到类似图3所示的界面。点击“Click to make RMI connection”按钮。一段时间后,检查是否有响应信息输出到了NetBeans IDE底部的输出控制台上。每连接成功一次,按钮下面的计数器就会增加一。
JavaFX客户端调用远程服务器
              图3  JavaFX客户端调用远程服务器

          总结(Conclusion)


          本文简单介绍了使用JavaFX Script和RMI进行客户端--服务器编程的方法。在本文中,JavaFX平台应用在整个客户端中。本系列的第三部分将讨论使用JavaFX平台和Java API for XML Web Services(JAX-WS)处理客户端--服务器通信的方式。以后的文章中将使用已有的客户端-服务器Java代码集成到JavaFX Script平台中。

         更多信息参考(For More Information)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Canvas API是JavaFX中用于绘制图形的一个强大的工具,它可以让你以像素为单位绘制形状、线条、文本和图像,并且可以使用不同的绘图属性来控制渲染。如果你想要清晰地绘制图形,那么使用Canvas API可以让你轻松实现。 以下是使用Canvas API进行清晰绘图的几个技巧: 1. 使用高分辨率的Canvas 在创建Canvas对象时,可以指定它的宽度和高度。如果你需要绘制的图形很复杂,或者需要绘制的图形比较大,那么可以使用高分辨率的Canvas来保证图形的清晰度。例如,如果你需要绘制一个1000x1000像素的图形,那么可以这样创建Canvas对象: ``` Canvas canvas = new Canvas(1000, 1000); ``` 2. 使用反锯齿 反锯齿可以让图形的边缘更加平滑,从而使图形看起来更加清晰。你可以通过设置Canvas对象的antiAliasing属性来启用反锯齿: ``` canvas.setAntiAliasing(true); ``` 3. 使用线性插值 线性插值可以让图形的颜色更加平滑,从而使图形看起来更加清晰。你可以通过设置Canvas对象的interpolation属性来启用线性插值: ``` canvas.setInterpolation(Interpolation.LINEAR); ``` 4. 使用高质量的渲染模式 Canvas API支持多种渲染模式,包括DEFAULT、QUALITY和SPEED。QUALITY模式可以提供最高质量的渲染,从而使图形看起来更加清晰。你可以通过设置Canvas对象的rendering属性来启用高质量的渲染模式: ``` canvas.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); ``` 使用这些技巧可以让你轻松实现清晰的绘图效果,并且可以为你的应用程序增加一些视觉上的吸引力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值