`
saboo
  • 浏览: 72217 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Flex ByteArray Socket

    博客分类:
  • Flex
阅读更多

 

ByteArray

Class public class ByteArray 

继承 ByteArray -->  Object 

Implements IDataInput, IDataOutput 

Subclasses ByteArrayAsset 

 

属性:

bytesAvailable : uint  [] 可从字节数组的当前位置到数组末尾读取的数据的字节数。

defaultObjectEncoding : uint [] 指示用于新 ByteArray 实例的 ByteArray 类的默认对象编码。

length : uint ByteArray 对象的长度(以字节为单位)。

position : uint 将文件指针的当前位置(以字节为单位)移动或返回到 ByteArray 对象中。

 

方法:

ByteArray() 创建一个表示填充的字节数组的 ByteArray 实例,以便使用此类中的方法和属性来优化数据存储和数据流。

writeUTF(value:String):void 将 UTF-8 字符串写入字节流。

writeUTFBytes(value:String):void 将 UTF-8 字符串写入字节流。

writeByte(value:int):void 在字节流中写入一个字节。

writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void  

将指定字节数组 bytes(起始偏移量为 bytes,从 0 开始的索引)中包含 length 个字节的字节序列写入字节流。

offset:uint (default = 0) — 从 0 开始的索引,表示在数组中开始写入的位置。

 

 

 

 

Socket

Class public class Socket 

继承 Socket  EventDispatcher  Object 

Implements IDataInput, IDataOutput 

类使 代码可以建立套接字连接并读取和写入原始二进制数据。它与 XMLSocket 类似,但没有指定接收或传输的数据格式。

属性:

bytesAvailable : uint [] 输入缓冲区中可读取的数据的字节数。

connected : Boolean [] 指示此 Socket 对象目前是否已连接。

objectEncoding : uint 在写入或读取对象时,控制所使用的 AMF 的版本。

方法:

Socket(host:String = null, port:int = 0) 创建一个 Socket 对象。

close():void 关闭套接字。 Socket 

connect(host:String, port:int):void 将套接字连接到指定的主机和端口。 Socket 

dispatchEvent(event:Event):Boolean 将事件调度到事件流中。 EventDispatcher 

flush():void 对套接字输出缓冲区中积累的所有数据进行刷新。 

readByte():int 从套接字读取一个带符号字节。 Socket 

   readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void 从套接字读取 length 参数所指定的数据的字节数。 

readMultiByte(length:uint, charSet:String):String 使用指定的字符集,从该字节流读取一个多字节字符串。

readUnsignedByte():uint 从套接字读取一个无符号字节。 Socket 

   readUnsignedInt():uint 从套接字读取一个无符号的 32 位整数。 Socket 

   readUnsignedShort():uint 从套接字读取一个无符号的 16 位整数。 

readUTF():String 从套接字读取一个 UTF-8 字符串。 Socket 

   readUTFBytes(length:uint):String 从套接字读取 length 参数所指定的 UTF-8 数据的字节数,并返回一个字符串。 

writeByte(value:int):void 将一个字节写入套接字。 Socket 

   writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void 从指定的字节数组写入一系列字节。 

writeMultiByte(value:String, charSet:String):void 使用指定的字符集,从该字节流写入一个多字节字符串。 Socket 

   writeObject(object:*):void 以 AMF 序列化格式将一个对象写入套接字。 Socket 

   writeShort(value:int):void 将一个 16 位整数写入套接字。 Socket 

   writeUnsignedInt(value:uint):void 将一个无符号的 32 位整数写入套接字。 Socket 

   writeUTF(value:String):void 将以下数据写入套接字:一个无符号 16 位整数,它指示了指定 UTF-8 字符串的长度(以字节为单位),后面跟随字符串本身。 Socket 

   writeUTFBytes(value:String):void 将一个 UTF-8 字符串写入套接字。

 

 

事件: Event.XX close 在服务器关闭套接字连接时调度。 Socket connect 在建立网络连接后调度。 Socket deactivate Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时调度。 EventDispatcher ioError 在出现输入/输出错误并导致发送或加载操作失败时调度。 Socket securityError 若对 Socket.connect() 的调用尝试连接到调用方安全沙箱外部的服务器或端口号低于 1024 的端口,则进行调度。 Socket socketData 在套接字接收到数据后调度。

--------------------------------------------------------------------------

Flex 端 代码(跟好的理解Socket):

 

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="353" height="336"

creationComplete="initApp();" >

<mx:Script>

<![CDATA[

private var socket:Socket = new Socket();

private var intClient:int; //定义客户端数字出拳

private var intServer:int; //定义服务端数字出拳

private var intSY:int; //定义输赢判断

private var strClient:String; //客户端文字出拳

private var strServer:String; //服务端的文字出拳

internal function initApp():void{

socket.connect("127.0.0.1",8888);

socket.addEventListener(Event.CONNECT,funConnect);

                socket.addEventListener(Event.CLOSE,funClose);

                socket.addEventListener(ProgressEvent.SOCKET_DATA,funSocket);

}

internal function funConnect(e:Event):void{

myText.text+="连接已建立 \n";

}

internal function funClose(e:Event):void{

myText.text+="连接已关闭 \n";

}

private function sendMessage(msg:String):void{

var message:ByteArray = new ByteArray();

message.writeUTF(msg); //发送出拳数字

socket.writeBytes(message);

socket.flush();

intClient=int(msg);

switch(intClient){ //将数字转换成文字用于发布到屏幕上

case 0:

                            strClient="剪刀";

                            break;

                    case 1:

                            strClient="锤";

                            break;

                    case 2:

                            strClient="包袱";

                            break;

}

myText.text+="你出:"+strClient+";  ";

                myInput.text="";

}

internal function funSocket(e:ProgressEvent):void{ //接到服务器信息

var msg:String="";

while(socket.bytesAvailable)

{

msg=socket.readUTF();

intServer=int(msg);

intSY=intClient-intServer; //通过数值判断输赢

switch(intServer) //将数字转换成文字用于发布到屏幕上

                    {

                        case 0:

                                strServer="剪刀";

                                break;

                        case 1:

                                strServer="锤";

                                break;

                        case 2:

                                strServer="包袱";

                                break;

                    }

                    myText.text+="服务器出:"+strServer+";  ";

                    //判断输赢的算法

                    if(intSY>0&&intSY<2)

                    {

                            myText.text+=" 结果:你赢了 \n";

                    }else if(intClient==intServer)

                    {

                            myText.text+=" 结果:平手 \n";

                    }else if(intSY<0&&intSY>-2)

                    {

                            myText.text+=" 结果:你输了 \n";

                    }else if(intSY>=2)

                    {

                            myText.text+=" 结果:你输了 \n";

                    }else if(intSY<=-2)

                    {

                            myText.text+=" 结果:你赢了 \n";

                    }

                    // myText滚动到最下面

                    myText.verticalScrollPosition = myText.maxVerticalScrollPosition;

}

}

]]>

</mx:Script>

<mx:TextArea x="10" y="32" width="331" height="263" id="myText"/>

    <mx:TextInput x="10" y="303" width="245" id="myInput"/>

    <mx:Button x="273" y="304" label="发送" id="myBtn" click="sendMessage(myInput.text)"/>

    <mx:Label x="10" y="10" text="规则:0代表剪刀;1代表锤;2代表包袱" width="331" fontWeight="bold"/>

</mx:Application>


Java 端代码:
package f1.f1_005.socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
import java.util.Vector;

/**
知识点:套接字管理器(Vector)会将于客户机连接的套接字添加到其列表中,在客户机断开连接后,在将相应的套接自从列表中删除,从中可以看出,客户机连接数与列表中添加套接字数目是一致的。
Vector sManager=new Vector();
sManager.add(socket);  // 向列表添加套接字
sManager.remove(socket);   //从列表移除套接字
sManager.size();  //获取客户机连接数
*/
public class Server4 {
private ServerSocket server;
//Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大。
Vector sManager = new Vector(); //管理套接字的Vector
Random rnd = new Random(); //创建随机数的发生器
public Server4(){}
void startServer() //运行服务器
{
try {
server = new ServerSocket(8888);
System.out.println("服务器套接字已创建成功!");
while (true)
{
Socket socket = server.accept();
System.out.println("已经与客户机连接");
new KBBCom_Thread(socket).start();
sManager.add(socket);
System.out.println("当前客户机连结数:"+sManager.size());
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server4 server=new Server4();
        server.startServer();
}
class KBBCom_Thread extends Thread  //与客户机进行通信的线程累
{
Socket socket; //套接字引用变量
private DataInputStream reader; //套接字输入流
private DataOutputStream writer;
KBBCom_Thread(Socket socket){ //构造函数
this.socket = socket;
}
public void run(){
try {
//获取套接字的输入输出流
reader = new DataInputStream(socket.getInputStream());
writer = new DataOutputStream(socket.getOutputStream());
String msg;
//如果收到客户端发来的数据
while((msg=reader.readUTF())!= null){
//向客户机传送0-2之间的整型随机数
writer.writeUTF(rnd.nextInt(3)+"\n");
writer.flush();
System.out.println("来自客户机:"+msg);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
sManager.remove(socket); //删除套接字
//关闭输入输出流及套接字
if(reader!=null)reader.close();
if(writer!=null)writer.close();
if(socket!=null)socket.close();
reader=null;
writer=null;
socket=null;
//向屏幕输出相关信息
System.out.println("客户机离开");
                    System.out.println("当前客户机的连接数:"+sManager.size());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}


--------------------------------------------------------------------------
以上看不懂,可以一步一步来,去理解
参考文章:http://bbs.9ria.com/viewthread.php?tid=3256&page=1&extra=page%3D1

--------------------------------------------------------------------------
ByteArray实例代码:
var byteArr:ByteArray = new ByteArray();
byteArr.writeBoolean(false);
trace(byteArr.length); // 1
trace(byteArr[0]); // 0

/*
ByteArray 类提供用于优化读取、写入以及处理二进制数据的方法和属性。
ByteArray字节数组中存储的是字节流。
所以,在你存入的内容,都是转化成字节的格式存储的。
boolean类型,占,一个字节,8位
double 类型,占,占八哥字节,8*8=64位。
不够位数的补0,例如,3.1415926,把其转化成二进制的形式然后在其数组中存储,然后按8位为一个字节
*/
byteArr.writeDouble(Math.PI);  // trace(Math.PI); //3.141592653589793
trace(byteArr.length); // 9
trace(byteArr[0]); // 0     
trace(byteArr[1]); // 64
trace(byteArr[2]); // 9
trace(byteArr[3]); // 33
trace(byteArr[4]); // 251
trace(byteArr[5]); // 84
trace(byteArr[6]); // 68
trace(byteArr[7]); // 45
trace(byteArr[8]); // 24
byteArr.position = 0;
try { trace(byteArr.readBoolean() == false); // true } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. } try { trace(byteArr.readDouble()); // 3.141592653589793 } catch(e:EOFError) { trace(e); // EOFError: Error #2030: End of file was encountered. }


Soclet 实例代码:
package {
    import flash.display.Sprite;
    public class SocketExample extends Sprite
    {
        public function SocketExample() {
        var socket:CustomSocket = new CustomSocket("localhost", 80);
    }
    }
    }

import flash.errors.*; import flash.events.*;
import flash.net.Socket;
class CustomSocket extends Socket
{
    private var response:String;
    public function CustomSocket(host:String = null, port:uint = 0)
    {
        super(host, port);
        configureListeners();
    }

    private function configureListeners():void
    {
        addEventListener(Event.CLOSE, closeHandler);
        addEventListener(Event.CONNECT, connectHandler);
        addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);                    addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);            addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
    }

    private function writeln(str:String):void {
        str += "\n"; try {
            writeUTFBytes(str);
        } catch(e:IOError)
        {
            trace(e);
        }
    }
    private function sendRequest():void {
        trace("sendRequest"); response = ""; writeln("GET /"); flush();
    }
    private function readResponse():void
    {
        var str:String = readUTFBytes(bytesAvailable); response += str;
    }
    private function closeHandler(event:Event):void
    {
        trace("closeHandler: " + event); trace(response.toString());
    }
    private function connectHandler(event:Event):void
    {
        trace("connectHandler: " + event); sendRequest();
    }
    private function ioErrorHandler(event:IOErrorEvent):void
        { trace("ioErrorHandler: " + event);
    }
    private function securityErrorHandler(event:SecurityErrorEvent):void
        { trace("securityErrorHandler: " + event);
    }
    private function socketDataHandler(event:ProgressEvent):void
        { trace("socketDataHandler: " + event); readResponse();
    }
}

 

0
0
分享到:
评论

相关推荐

    flex byteArray to sound

    在Flex编程中,有时我们需要处理音频数据,例如从网络接收或者本地存储的字节数组(ByteArray)中读取音频信息,并将其转化为可播放的声音(Sound)。标题"flex byteArray to sound"表明我们要讨论的是如何将一个...

    Flex 与 Struts2 ByteArray 数据上传

    标题中的“Flex 与 Struts2 ByteArray 数据上传”指的是在Web开发中,使用Adobe Flex作为前端客户端,通过Struts2框架在后端处理字节数组(ByteArray)数据的上传技术。Flex是一种基于Adobe Flash Player或Adobe AIR...

    用php的socket跟flash的socket通信

    - **创建 Socket**:使用 `Socket` 类实例化一个 Socket 对象。 - **连接 Socket**:使用 `connect` 方法进行连接。 - **读取数据**:使用事件监听器监听 `DATA` 事件来接收数据。 - **写入数据**:使用 `...

    Java和Flex交互常见问题及解决

    - **问题描述**:在Java与Flex之间进行Socket通信时,如果发送的数据量较大或者网络环境不稳定,就有可能出现粘包现象。具体表现为接收端接收到的数据不是按照预期的方式分割的,而是多个数据包被错误地合并到了一起...

    char bytearray string的区别.docx

    在编程领域,`char`、`bytearray` 和 `string` 是三种常见的数据类型,它们在不同的场景下有着各自独特的用途。特别是在机器视觉、Qt 和 C++ 这样的上下文中,理解它们的区别至关重要。 首先,`char` 在C++中通常...

    flex air 导出 excel

    4. **文件下载**:服务器返回的Excel文件二进制流,可以在Flex Air应用中通过ByteArray读取并提供给用户下载。使用FileReference类,可以触发浏览器的下载对话框,让用户保存Excel文件。 5. **处理中文字符**:由于...

    Flex 保存组件至本地

    Flex并不直接支持PNG编码,但我们可以使用`flash.utils.ByteArray`来实现。首先,创建一个`ByteArray`,然后使用`BitmapData`的`encode()`方法将位图数据编码为PNG: ```actionscript var pngBytes:ByteArray = ...

    flash as3.0 socket编程

    read() 方法可以从服务器读取数据,并将其存储在 ByteArray 对象中。 4. 同 Socket 服务器进行握手 在与 Socket 服务器建立连接后,我们需要同服务器进行握手,以确定收到了什么样的数据和如何处理这些数据。我们...

    Flex图片上传实例

    ### Flex图片上传实例详解 在本篇文章中,我们将深入探讨一个具体的Flex图片上传实例,并对其中涉及的关键技术点进行详细解读。此实例不仅提供了一个实际的上传图片的应用场景,而且还包含了一些实用的代码片段,这...

    flex 实现图片另存为

    ### Flex 中使用 `FileStream` 和 `ByteArray` 实现图片另存 #### 1. **基础知识简介** - **Flex**:一种用于构建跨平台桌面应用程序和移动应用程序的技术。它基于Adobe Flash Player运行时环境,并使用MXML...

    Flex调用JavaServlet将组件快照导出成图片

    在本场景中,我们将讨论如何在Flex中捕获组件的快照,将其转换为ByteArray,并通过JavaServlet将其导出为图片。 首先,让我们深入了解Flex中的组件快照。在Flex中,我们可以使用BitmapData类来捕获组件的视觉表示,...

    FLASH AS3 SOCKET收发16进制示例

    `HEXtoString as3.as`这个文件可能包含一个函数,用于将16进制字符串转换为ByteArray,以便于Socket通信。 在AS3中,使用Socket类的步骤如下: 1. **创建Socket实例**:首先,你需要创建一个Socket对象,例如`var ...

    flex生成图片并保存

    Flex是一种基于ActionScript和MXML的开源框架,用于构建富互联网应用程序(RIA)。在Flex中,我们可以利用其强大的图形处理能力来生成图片,并将其保存到本地或者服务器。本篇文章将详细探讨如何在Flex中实现这一...

    ByteArray-Scale-Bitmap.rar_ByteArray_slice

    "ByteArray-Scale-Bitmap.rar_ByteArray_slice" 提供了一种利用ByteArray来处理9-slice Bitmap缩放的技术,这对于优化GUI性能和适应不同屏幕尺寸至关重要。9-slice缩放是一种特殊的图像拉伸方法,它确保了图片在放大...

    Base64_FLEX编码 范例

    4. **ActionScript 3.0数据类型**: 在FLEX中,`ByteArray`类用于存储和操作字节数据,而`String`类则用于处理文本。在Base64编码过程中,这两者之间的转换是必要的。 5. **使用示例**: `Base64Util.docx`可能包含...

    flex加载html页面

    首先,需要将HTML文件转换为`ByteArray`,然后加载到`Loader`中。以下是一个示例: ```actionscript var htmlLoader:Loader = new Loader(); var htmlRequest:URLRequest = new URLRequest("path/to/your/...

    flex读取excel文件

    var bytes:ByteArray = stream.readBytes(); stream.close(); var excelDoc:ExcelDocument = new ExcelDocument(); excelDoc.loadFromByteArray(bytes); ``` 3. **处理数据** `loadFromByteArray`方法会...

    解决Flex 中文乱码

    使用AS3的`flash.utils.ByteArray`类,先读取原始数据,然后使用`ByteArray.readUTFBytes()`方法读取UTF-8编码的字符串,再通过`ByteArray.writeUTFBytes()`将其转换为UTF-16。 4. **XML处理**:在处理XML数据时,...

    flex 上传图像

    3. 上传ByteArray:现在,你可以使用ByteArray对象进行网络传输,例如通过HTTP服务或Socket连接发送。在Flex中,我们可以使用URLLoader类来上传数据。 ```actionscript var urlRequest:URLRequest = new URLRequest...

    Flex MP3播放器

    9. **URLLoader和ByteArray**:Flex中的URLLoader类用于加载网络资源,包括MP3文件。ByteArray则用于处理二进制数据,比如加载到内存中解码的MP3数据。 10. **皮肤和样式**:Flex允许通过皮肤和样式来自定义组件...

Global site tag (gtag.js) - Google Analytics