Flash Socket编程

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

如何连接服务器,

如何监听服务器的内容,

如何发送信息服务器,

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

package { import flash.net.Socket; import flash.events.*; import flash.display.Sprite; import flash.errors.*; import flash.display.SimpleButton; public class Client extends Sprite { private var mysocket:Socket; private var host:String="localhost"; private var port:int=8001; public function Client() { btn.addEventListener(MouseEvent.CLICK,SendData); mysocket=new Socket(); mysocket.addEventListener(Event.CONNECT,OnConnect); mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata); //mysocket.addEventListener(SecurityError mysocket.connect(host,port); } private function OnConnect(e:Event):void { trace("连接成功"); mysocket.writeUTFBytes("Test successful2/n"); mysocket.flush();//发送数据 } private function ioErrorHandler(e:IOErrorEvent):void { trace("连接失败"); } private function receivedata(e:ProgressEvent):void { trace("收到的字节数"+mysocket.bytesAvailable); var msg:String; while (mysocket.bytesAvailable) { msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8"); trace(msg); } } private function SendData(e:MouseEvent):void { trace("发送"); mysocket.writeUTFBytes("i am flash/n"); mysocket.flush();//发送数据 } } }

我们首先解决第一个问题:(其实在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 字符串写入套接字。
五:服务器程序
这里写一个简单服务器程序,使用一个简单的线程,不过线程并不完善,有缺 点,但不影响程序演示:
package com; import java.net.*; import java.io.*; public class Server implements Runnable { public void run() { PrintWriter os=null; try{ ServerSocket ss=new ServerSocket(8001); System.out.println("等待连接...."); Socket sk=ss.accept(); System.out.println("连接成功...."); BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream(),"utf-8")); System.out.println("获取里面的内容......"); //等待接受信息 os = new PrintWriter(sk.getOutputStream()); String word=null ; //发送信息 while((word=br.readLine())!=null) { System.out.println("内容:" + word); os.println("你好我是服务器"); os.flush(); } } catch(IOException ex) { ex.printStackTrace(); } } public static void main(String[] args) { new Thread(new Server()).start(); } }
接收结果:
等待连接....
连接成功....
获取里面的内 容......
内容: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. XML Socket类创建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策略文件例子:

dtd">




建立完连接后就可以对服务器进行写入,通过调用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

你可能感兴趣的:(flex/flash)