Flash Socket编程

来源:互联网 发布:淘宝美工面试题 编辑:程序博客网 时间:2024/04/30 09:49

现在来写一个flash 客户端,这里要解决的问题包括,

如何连接服务器,

如何监听服务器的内容,

如何发送信息服务器,

现在发一段简单的代码,这个代码很简单,功能不完整,为的是能够清晰一点让我们学习flash socket编程。

我们首先解决第一个问题:(其实在cookbook那里已经有说的)这里简单演示一下

一.连接服务器:

mysocket=new Socket();
mysocket.addEventListener(Event.CONNECT,OnConnect);

mysocket.connect(host,port);

host :是连接的ip端,这里连接本地所以使用localhost 或者127.0.0.1 就ok

port:端口号只有大于1024的时候基本上可以顺利,小于1024还要进行一些配置

监听连接是否成功:

private function OnConnect(e:Event):void
  {
   trace("连接成功");
   mysocket.writeUTFBytes("Test successful2/n");
   mysocket.flush();//发送数据

  }

连接成功后,我们可以发送一个简单信息给服务器:

mysocket.writeUTFBytes("Test successful2/n");
mysocket.flush();//发送数据

注意,有个/n没有这个回车符,看看会有一些什么发生呢。

使用writeUTFBytes 是不可能立刻发送数据给服务器的,还要使用flush方法才能发送给服务器。

二.处理错误:

mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

private function ioErrorHandler(e:IOErrorEvent):void
  {
   trace("连接失败");
  }

三.接收服务器返回的信息

mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);

private function receivedata(e:ProgressEvent):void
  {
   trace("收到的字节数"+mysocket.bytesAvailable);
   var msg:String;
   while (mysocket.bytesAvailable)
   {
    msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");
    trace(msg);
   }
  }

这样我们可以接收到服务器发送来的信息,但是存在一个问题,接收数据会存在一个回车符合的问题,需要我们去解决。这里暂时不多说

 

看上面的

参考:

bytesAvailable : uint

[read-only] 输入缓冲区中可读取的数据的字节数
readMultiByte(length:uint, charSet:String):String
使用指定的字符集,从该字节流读取一个多字节字符串。
四,发送信息给服务器
 问题:我们希望发送信息给服务器
解决:
使用writeUTFBytes 方法
private function SendData(e:MouseEvent):void
  {
   trace("发送");
   mysocket.writeUTFBytes("i am flash/n");
   mysocket.flush();//发送数据

  }
在场景上放一个按钮上去,通过点击按钮事件,发送信息给服务器socket端口。
参考:
 
writeUTFBytes(value:String):void
将一个 UTF-8 字符串写入套接字。
五:服务器程序
这里写一个简单服务器程序,使用一个简单的线程,不过线程并不完善,有缺点,但不影响程序演示:
    接收结果:
    等待连接....
    连接成功....
    获取里面的内容......
    内容:Test successful2
    内容:i am flash
    内容:i am flash
    内容:i am flash
    内容:i am flash
    内容:i am flash
    为了让程序更加完善,我们可以将程序修改得更加完善
    客户端发送的内容:
    连接成功
    收到的字节数16
    null你好我是服务器
    注意:出现null这个结果,也许在服务出现一些小毛笔,但基本发送数据的和接收数据都成功了
    程序需要完善的地方:
    包括客户端和服务器
    处理回车符合问题
    最后发现原来在var msg:String="";写上这样null 就不会出现了

    补充:
    Socket套接字连接允许Flash播放器通过指定的端口与服务器通信,但是socket通讯在数据传输完毕后仍然不会关闭,要人为的关闭。我们可以使用flash.net.XMLSocket类创建XML数据格式的socket连接,使用flash.net.Socket类创建二进制数据格式socket连接,相比xml数据格式,二进制链接更低级,但是它可以连接到几乎所有的socket服务器端程序as3.0 中的提供的socket链接都是异步的,也就是说你必须增加事件侦听在传输完数据以后才可以获得

    要建立socket通讯,首先要建立socket连接,我们可以使用Socket.connect( )或XMLSocket.connect( )方法建立连接并监听connect事件确定连接是否建立。连接只需要2个参数,IP,和端口。

    注意条件:

    swf 和主机必须在同一个域;
    网络上的swf不能连接本地服务器;
    本地的swf 不能访问任何网络资源;
    要允许域名交叉访问或连接低于1024的端口,需要提供cross-domain 策略文件

    如果要不同域中的flash相互访问可以通过flash.system.Security.loadPolicyFile( )读取:
    Security.loadPolicyFile("cross-domain");
    cross-domain策略文件例子:
    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domainpolicy.
    dtd">
    <cross-domain-policy>
    <allow-access-from domain="*" to-ports="80,110" />
    </cross-domain-policy>

    建立完连接后就可以对服务器进行写入,通过调用write方法,可以写把数据写入缓冲池中,然后在调用flush()方法就可以把数据发送出去,这里是针对二进制的socket,如果是xml请调用send()方法。as3.0可以通过对不同的参数定义不同的写入函数:是writeBoolean( ), writeByte( ), writeBytes( ),
    writeDouble( ), writeFloat( ), writeInt( ), writeMultiByte( ), writeObject( ), writeShort( ), write-
    UnsignedInt( ), writeUTF( ), 和writeUTFBytes( ) 。根据函数名就可以知道需要传入的参数,这里就对socket.writeBytes(byteArray, 0, byteArray.length);进行说明,因为它可以传递一个数据 ,并制定数组的开始和结束位置进行写入。,writeUTFBytes( ):写入字节型的字符串,writeUTF:数字型的字符串。writeMultiByte()以指定编码写入字符串,socket.writeMultiByte("example", "unicode");

        发送完数据后就要接受数据,因此我们可以通过ProgressEvent.SOCKET_DATA事件处理函数中读取数据,利用readBoolean():Boolean,readByte():int,readDouble():Number,readFloat():Number,readInt():int,readObject():*,readShort():int,readUnsignedByte():uint,readUnsignedInt():uint,readUnsignedShort():uint,readUTF():String,readBytes()无返回参数,readUTFBytes( )返回utf8数据。Socket对象接收的数据都是ASCII编码的文本,我们可以用readUTFBytes( )方法重新构造字符串,
    readUTFBytes( )方法需要知道有多少个字节需要转换,用bytesAvailable属性指定字节数:
    var string:String = socket.readUTFBytes(socket.bytesAvailable);

    以上提到的是采用二进制的socket传输方式,如果采用xml的方式,那么触发的事件类型不同,它触发的是DataEvent.DATA事件,事件的data属性中包含传递来的数据,如果我们要读取xml就必须先将data中的字符串转换为xml格式,然后进行读取。

    转自http://520pig.blogbus.com/logs/32821429.html