×

Flash的Socket与WebService功能

Kalet Kalet 发表于2009-08-11 13:39:38 浏览304 评论0

抢沙发发表评论

最近接触了Flash。当然以我的能力肯定做不了动画的,而是把Flash当成一个受管的编程平台,去做一些小程序的开发了。
第一个问题是Socket。Flash是支持TCP Socket的,但实现起来有点别扭。首先我没有发现Flash有监听端口的能力,这也正常,如果用户打开一个带Flash的网页,就会监听一个端口,那确实有点不厚道。在flash中Socket类叫做XMLSocket,通过Connect方法实现与服务器的连接,通过Send方法向服务器发送数据,通过close方法主动结束一个连接,通过OnData事件实现接收数据,通过OnClose事件实现被动的关闭连接。例如:
s = new XMLSocket();
s.connect("localhost", 12345);
s.OnConnect = function(result) {
  trace(result);
}
s.OnData = function(data) {
{
 trace("data");
}
s.OnClose = function() {
 trace("closed");
}
...
 
s.send("haha");
 
有一个与众不同的地方,就是flash在发送数据的时候会自动在数据后面加一个'\0',也就是说接收到的内容比实际要发送的内容多一个字节,这还不是大问题,另一个问题是向flash发送数据时后面也必须跟随一个'\0',只有遇到'\0',OnData事件才会触发。因此要flash来实现一些流行的协议的客户端是很困难的,因为它们并不是以'\0'作为一条消息的结束。
 
第二个问题是flash的WebService。flash 8 Professional是支持访问WebService的。虽然它并不会像Visual Studio.Net那样生成强类型的代理类,但它在运行阶段也可以把工作作得很好。例如对于一个WebService函数:
[WebMethod]
public string HelloWorld()
{
  return "Hello World!";
}
 
在flash中要访问它,首先向页面中加入一个WebServiceConnector组件,命名为s1,并设置它的WSDL属性,例如:http://localhost/TestService/service1.asmx?wsdl
设置它的operation属性为要调用的web method的名字,如HelloWorld
然后,设置一下当取回数据时触发的事件:
var getResult = function(ev) {
  text1.text = ev.target.results;  //text1是界面上一个输入文本框
}
 
s1.addEventListener("result", getResult);
 
在需要调用WebService的地方只需要写上一句:
s1.trigger();
就可以了。
当然也有把参数、返回值与界面绑定的做法,网上有很多介绍,这里就不多说了。
另外,flash对于较复杂类型的返回参数也有较好的支持,例如,可以支持返回结构体、数组类型(其他类型尚未实验)。例如:
struct A
{
  public int intValue;
  public String strValue;
}

[WebMethod]
public A GetA()
{
  A a = new A();
  a.intValue = 1;
  a.strValue = "Hello world";
  return a;
}
////
 
var getResult = function(ev)
{
  text1.text = ev.target.results.strValue;
}
 
 
s1.trigger();

群贤毕至

访客