Haxe 远程处理是一个在不同平台之间通讯的方式。通过Haxe的远程处理,应用可以透明的传送数据,发送数据,和在服务端/客户端之间调用方法。
在API 文档中查看 remoting 包了解它的类的更多细节。
为了使用 remoting ,必须有一个连接建立。有两种Haxe 远程连接:
- haxe.remoting.Connection 是用于同步连接,调用一个方法时结果可以直接获得。
- haxe.remoting.AsyncConnection 用于异步连接,结果是在执行过程中之后发生的事件。
有一些目标平台特定的构造函数用于不同的目的,可以用来设置一个连接:
- 所有目标平台
HttpAsyncConnection.urlConnect(url:String)
: 返回一个到指定URL的异步连接,可以连接到一个Haxe服务端应用。
- Flash
ExternalConnection.jsConnect(name:STRING, ctx:Context)
: 允许一个到本地JavaScript Haxe 代码的连接。JS Haxe代码必须被包含 ExternalConnection 类进行编译。这只适用于Flash Player 8 和更高版本。AMFConnection.urlConnect(url:String) 和 AMFConnection.connect(cnx: NetConnection)
: 允许到一个AMF远程服务器(如Flash 媒体服务器或者 AMFPHP)的连接。SocketConnection.create(sock:flash.XMLSocket)
: 允许在XMLSocket上进行远程通讯。LocalConnection.connect(name:String)
: 允许在Flash LocalConnection上进行远程通讯。
- JavaScript
- ExternalConnection.flashConnect(name:String, obj:String, ctx:Context) 允许连接到一个指定的Flash对象。Haxe Flash内容必须被加载,并且它必须包含 haxe.remoting.Connection 类。只用于Flash8 或更高版本。
- Neko
- HttpConnection.urlConnect(url:String) 像异步版本一样使用,但是在同步模式下工作。
- SocketConnection.create(...) 允许实时和一个使用一个XML Socket来连接服务的Flash客户端通讯。
在平台之间通讯之前,一个远程处理的上下文必须被定义。这是一个可以被客户端代码的连接上调用的共享的API。
这个服务代码示例创建和共享一个API :
class Server {
function new() { }
function foo(x, y) { return x + y; }
static function main() {
var ctx = new haxe.remoting.Context();
ctx.addObject("Server", new Server());
if(haxe.remoting.HttpConnection.handleRequest(ctx))
{
return;
}
// handle normal request
trace("This is a remoting server !");
}
}
连接使用起来非常方便。一旦连接被获得,使用经典的点语法来屏幕一个路径,然后使用 call() 调用远程上下文中的方法,并获得结果。异步连接接受一个附加的函数参数,在结果获得之后被调用。
客户端代码示例连接到服务端远程上下文并调用这个API上的一个函数 foo()。
class Client {
static function main() {
var cnx = haxe.remoting.HttpAsyncConnection.urlConnect("http://localhost/");
cnx.setErrorHandler( function(err) trace('Error: $err'); } );
cnx.Server.foo.call([1,2], function(data) trace('Result: $data'););
}
}
要使它用于Neko目标平台,设置一个Neko Web 服务器,指向Client中的url到 “http://localhost:2000/remoting.n” ,并使用 -main Server -neko remoting.n 编译 Server 。
- 当在异步调用中发生一个错误,就像上面例子中看到的,错误处理程序将被调用。
- 当在同步调用中发生一个错误,在访客端一个异常被抛出,就像我们调用一个本地方法。
Haxe 远程处理可以发送多种不同种类的数据。查看 序列化(第10.8节)。
查看API文档中的 remoting 包 详细了解它的类。
包含js客户端的html页面必须在跟服务器运行的同样的域名下提供服务。同源策略限制一个源上的一个文档或脚本如何和另一个源上的资源交互。同源策略作为一种手段来防止一些跨站点请求伪造攻击。
要跨域使用remoting,需要通过在 .htaccess 中定义头 X-Haxe-Remotinig 来启用CORS(cross-origin资源共享)。
# Enable CORS
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Header set Access-Control-Allow-Headers: X-Haxe-Remoting
查看同源策略了解更多这个话题的信息。
也要注意,这意味着页面不能被从文件系统直接提供服务:
"file:///C:/example/path/index.html"
当 Flash 访问一个不同域名的服务器,设置服务器上一个 crossdomain.xml 文件,使用 X-Haxe 头。
<cross-domain-policy>
<allow-access-from domain="*"/> <!-- or the appropriate domains -->
<allow-http-request-headers-from domain="*" headers="X-Haxe*"/>
</cross-domain-policy>
关于在一个方法被远程调用时参数类型会被遵守,没有任何种类的保证。也就是说即使函数foo的参数类型化为 Int,客户端仍然可以在调用方法时使用字符串作为参数。这可以导致一些情况下的安全问题。当不确定时,在函数被调用使用 Std.is 方法检查参数类型。