Flash简单Socket示例

Home / Article MrLee 2014-11-23 2928

现在来写一个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策略文件例子:
建立完连接后就可以对服务器进行写入,通过调用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格式,然后进行读取。

本文链接:https://www.it72.com/296.htm

推荐阅读
最新回复 (0)
返回