今天跟着网上做了一个flash socket 聊天,主要了解下flash如何与java的socket通信。
一段代码CustomSocket.as
- package
- {
- import flash.events.*;
- import flash.net.Socket;
- import flash.system.*;
- import flash.utils.ByteArray;
- import flash.utils.setTimeout;
- import fl.controls.TextArea;
- import fl.core.UIComponent;
- /**
- * ...
- * @author DefaultUser (Tools -> Custom Arguments...)
- */
- public class CustomSocket
- {
- private const CR:int = 13; // Carriage Return (CR)
- private const WILL:int = 0xFB; // 251 - WILL (option code)
- private const WONT:int = 0xFC; // 252 - WON'T (option code)
- private const DO:int = 0xFD; // 253 - DO (option code)
- private const DONT:int = 0xFE; // 254 - DON'T (option code)
- private const IAC:int = 0xFF; // 255 - Interpret as Command (IAC)
- private var serverURL:String;
- private var portNumber:int;
- private var socket:Socket;
- private var ta:TextArea;
- private var state:int = 0;
- System.useCodePage = false;
- public function CustomSocket(server:String, port:int, output:TextArea)
- {
- serverURL = server;
- portNumber = port;
- ta = output;
- socket = new Socket();
- socket.addEventListener(Event.CONNECT, connectHandler);
- socket.addEventListener(Event.CLOSE, closeHandler);
- socket.addEventListener(ErrorEvent.ERROR, errorHandler);
- socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
- socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);
- Security.loadPolicyFile("http://" + serverURL + ":" + portNumber + "/crossdomain.xml");
- try
- {
- msg("Trying to connect to" + serverURL + ":" + portNumber + "/n");
- socket.connect(serverURL,portNumber);
- }
- catch (error:Error)
- {
- msg(error.message + "/n");
- socket.close();
- }
- }
- public function ioErrorHandler(event:IOErrorEvent):void
- {
- msg("Unable to connect: socket error./n");
- }
- public function writeBytesToSocket(ba:ByteArray):void {
- trace(ba);
- socket.writeBytes(ba);
- socket.flush();
- }
- private function connectHandler(event:Event):void {
- if (socket.connected) {
- msg("connected.../n");
- } else {
- msg("unable to connect/n");
- }
- }
- private function closeHandler(event:Event):void
- {
- msg("closed.../n");
- }
- private function errorHandler(event:ErrorEvent):void {
- msg(event.text + "/n");
- }
- private function dataHandler(event:ProgressEvent):void {
- var n:int = socket.bytesAvailable;
- // Loop through each available byte returned from the socket connection.
- while (--n >= 0) {
- // Read next available byte.
- var b:int = socket.readUnsignedByte();
- switch (state) {
- case 0:
- // If the current byte is the "Interpret as Command" code, set the state to 1.
- if (b == IAC) {
- state = 1;
- // Else, if the byte is not a carriage return, display the character using the msg() method.
- } else if (b != CR) {
- msg(String.fromCharCode(b));
- }
- break;
- case 1:
- // If the current byte is the "DO" code, set the state to 2.
- if (b == DO) {
- state = 2;
- } else {
- state = 0;
- }
- break;
- // Blindly reject the option.
- case 2:
- /*
- Write the "Interpret as Command" code, "WONT" code,
- and current byte to the socket and send the contents
- to the server by calling the flush() method.
- */
- socket.writeByte(IAC);
- socket.writeByte(WONT);
- socket.writeByte(b);
- socket.flush();
- state = 0;
- break;
- }
- }
- }
- private function msg(value:String):void {
- ta.text += value;
- ta.dispatchEvent(new Event(Event.CHANGE));
- setTimeout(setScroll, 100);
- }
- public function setScroll():void {
- ta.verticalScrollPosition = ta.maxVerticalScrollPosition;
- }
- }
- }
- 这个as有的地方没有理解:初始化定义常量时,不知道为什么定义?希望有人能够解释下,小弟不胜感激。
下面还有个Main .as
- package
- {
- import flash.display.Sprite;
- import flash.events.MouseEvent;
- import flash.utils.ByteArray;
- import CustomSocket;
- public class Main extends Sprite
- {
- private var telnetClient:CustomSocket;
- public function Main() {
- setupUI();
- }
- private function connect(e:MouseEvent):void {
- //建立socket通信的链接
- telnetClient = new CustomSocket(serverName.text, int(portNumber.text), output);
- }
- private function sendCommand(e:MouseEvent):void {
- var ba:ByteArray = new ByteArray();
- //将得到的信息写入ba中
- ba.writeMultiByte(command.text + "/n", "GBK");
- //通过连接写入socket中
- telnetClient.writeBytesToSocket(ba);
- command.text = "";
- }
- private function setupUI():void {
- loginBtn.addEventListener(MouseEvent.CLICK,connect)
- sendBtn.addEventListener(MouseEvent.CLICK,sendCommand);
- }
- }
- }