FlashSocke 通过flash进行socket通信(as代码)
在早期的项目中, 因为需要用IE上连接socket进行通信, 所以不得不借助于flash的socket功能,于是有了下面这个`FlashSocke`,供JavaScript调用 和 回调JavaScript.
code:
package
{
import flash.external.*;
import flash.display.Sprite;
//import flash.external.ExternalInterface;
import flash.events.*;
import flash.net.Socket;
import flash.system.*;
import flash.utils.Timer; //==============================================================================
public class Main extends Sprite
{
static var socket:Socket = null;
static var bConnecting:Boolean = false;
static var charSet:String;
static var Obj:String;
static var ReConNum:Number=0;
//var str:String; public function Main()
{
//添加JS调用的函数的接口。
ExternalInterface.addCallback("Connect",Connect);
ExternalInterface.addCallback("SendMsg",SendMsg);
ExternalInterface.addCallback("Close",Close);
ExternalInterface.addCallback("GetState",GetState);
}
//事件回调,当连接更改时
public function OnConnect(evt:Event=null):void
{
if(socket.connected)
bConnecting=false;
Debug(evt.toString());
ExternalInterface.call(Obj+"OnConnect",socket.connected);
}
//事件回调,被动关闭才会触发
public function OnClose(evt:Event):void
{
Debug(evt.toString());
bConnecting=false;
ExternalInterface.call(Obj+"OnClose");
} /*===============Flax事件回调函数==============================================*/ //事件回调,出错回调
public function errorHandler(evt:ErrorEvent):void
{
OnError(evt.errorID,evt.toString());
}
//事件回调,接收回调
public function ReciveHandler(evt:ProgressEvent):void
{
try
{
//OnMsg( socket.readUTFBytes(socket.bytesAvailable) );//UTF
//OnMsg( socket.readUTF());//Error #2030
//str=socket.readMultiByte(socket.bytesAvailable,charSet);
//Debug(str);
//ExternalInterface.call(Obj+"OnMsg",str.replace(new RegExp("\\", 'g'),"\\\\"));
ExternalInterface.call(Obj+"OnMsg",socket.readMultiByte(socket.bytesAvailable,charSet).replace(/\\/g,"\\\\"));
//OnMsg(socket.readMultiByte(socket.bytesAvailable,charSet));
}
catch (err:Error)
{
OnError(err.errorID,"接收数据时发生错误:"+err.toString());
}
} /*===============Flax调用JS函数==============================================*/ //调用JS函数OnError,出错回调
public function OnError(code:int,msg:String):int
{
ExternalInterface.call(Obj+"OnError",code,msg);
return code;
}
//调用JS函数Logs,显示日志信息
public function Debug(str:String):void
{
ExternalInterface.call(Obj+"Logs","[Flash]"+str);
} /*===============JS调用Flax函数==============================================*/ //通过JS调用Connect,初始化Socket,并连接
public function Connect(ip:String, port:int, obj:String="", charset:String="GBK", pf:String="")
{
//trace("Connect...");
try
{
if (socket && socket.connected)
{
ExternalInterface.call(Obj+"OnMsg","{}");
return Debug("已连接"),1;
}
if(bConnecting&&ReConNum<10)//连接次数小于10
{
ReConNum++;
return Debug("连接中... Connecting... Wait Please."),1;
}
ReConNum=0;
if (ip == "" || port == 0)
return OnError(-99,"不正确的IP或端口参数"),0; charSet=charset;
if(obj!="")
Obj=obj+".";//JS对象名; 这样可以调用JS对象的函数 Debug("Ver:2015-1120-1720");
Debug("Connect("+ip+", "+port+")"); try{
if(socket!=null)
socket.close();
}catch (error1:Error){} bConnecting=true; socket = new Socket ;
socket.timeout = 10000;//超时事件会被捕获为securityError事件,不知道为啥
socket.addEventListener(Event.CONNECT,OnConnect);//连接状态变化时,经常不执行;用定时器检查去了
socket.addEventListener(Event.CLOSE,OnClose);
socket.addEventListener(ErrorEvent.ERROR,errorHandler);
socket.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,errorHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA,ReciveHandler,false,0,true); //"http://" + serverIP + ":" + webport + "/crossdomain.xml";
//Security.allowDomain("*");
if (pf != "")
Security.loadPolicyFile(pf); socket.connect(ip,port);//连接是异步的
return 1;
}
catch (err:Error)
{
bConnecting=false;
socket.close();
return OnError(err.errorID,"连接时发生错误:"+err.toString()),0;
}
} //JS调用Close,关闭Socket
public function Close()
{//trace("Close.................");
try
{
socket.close();
}
catch (err:Error)
{
OnError(err.errorID,"关闭Socket时发生错误:"+err.toString());
}
bConnecting=false;
}
//JS调用GetState,返回Socket连接状态
public function GetState():Boolean
{
try
{
if(socket!=null)
return socket.connected;
else
return false;
}
catch(err:Error)
{
OnError(err.errorID,"GetState发生错误:"+err.toString());
}
return false;
}
//JS调用Send,发送数据,返回发送的数据的长度
public function SendMsg(msg:String):int
{
var len:int = 0;
if (socket && socket.connected)
{
try
{
//var ba:ByteArray = new ByteArray ;
//ba.writeUTFBytes(msg);
//socket.writeBytes(ba);
socket.writeMultiByte(msg,charSet);
//socket.writeUTF(msg+"\n");
socket.flush();
//sleep(50);
len = msg.length;
Debug("SendMsgLen:"+len);
}
catch (err:Error)
{
len = err.errorID;
OnError(err.errorID,"发送数据时发生错误:"+err.toString());
}
}
else
{
len = -96;
OnError(-96,"未连接或已断开,需要重新连接/登陆.");
}
return len;
} }//End class Main }//end package
当然,后来 浏览器们都纷纷更新,支持H5, 就是用WebSocket了, 于是不再是用这个破旧的东西了, 毕竟是插件嘛, 稳定性啥的,,,,(ps:flash会经常崩溃呀)
调用说明:
[FlashSocket:提供的函数接口]
//通过JS调用Connect,初始化Socket,并连接
//obj:设置函数的回调前缀(对象名,如:"fsObj"),使能回调象的函数(如"fsObj.OnMsg")
//charset:设置往来消息的字符编码,默认编码"GBK"
//pf:设置Security.loadPolicyFile 的地址
Connect(ip:String, port:int, obj:String="", charset:String="GBK", pf:String=""):void //通过JS调用SendMsg,发送数据,返回发送的数据的长度
SendMsg(msg:String):int //通过JS调用Close,关闭Socket
Close():void //通过JS调用GetState,返回Socket连接状态。
GetState():Boolean //通过JS调用GetServerIP,返回服务器IP地址
GetServerIP():String //通过JS调用GetServerPort,返回服务器端口
GetServerPort():int [JavaScript:提供的回调函数接口]
OnConnect(bool)
OnClose()
OnError(code,msg)
OnMsg(msgstr)
Logs(logstr)
那啥,编译成 `.swf` 就可以使用了.
要注意异步.
FlashSocke 通过flash进行socket通信(as代码)的更多相关文章
- Linux环境下用C语言实现socket 通信---简单代码
Socket编程实例: 服务器端:一直监听本机的8000号端口,如果收到连接请求,将接收请求并接收客户端发来的消息,并向客户端返回消息. 客户端:client.c /* File Name: clie ...
- [转]Flash Socket通信的安全策略
昨天做测试的时候遇到一个问题,做好的SWF在Flash AS3中调试通过,但是发布到html中之后就无法得到数据了.查了一些资料之后找到了解决办法.这里感谢 剑心 提供帮助,以及同事若水三千提供Jav ...
- Flash Socket通信的安全策略问题 843端口
1.问题描述 将flash发布为html格式后,加载页面后,swf无法与服务器进行socket通信.Flash端显示的错误为:securityErrorHandler信息: [Securi ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- Socket通信代码(原理)
1.运行环境:NetBeans IDE 6.0.1 2.说明:先运行服务器端,再运行客户端. 3.服务器端代码: 新建java类Test import java.net.*; import java. ...
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)
书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...
- Linux 下socket通信终极指南(附TCP、UDP完整代码)
linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...
- Jmeter自定义编写Java代码调用socket通信
一.前言 最近需要测试一款手机游戏的性能,找不到啥录制脚本的工具,然后,另外想办法.性能测试实际上就是对服务器的承载能力的测试,和各种类型的手机客户端没有啥多大关系,手机再好,服务器负载不了,也不能够 ...
- Socket通信客户端和服务端代码
这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...
随机推荐
- Spring的RestTemplata使用
spring-web的RestTemplata是对java底层http的封装,使用RestTemplata用户可以不再关注底层的连接建立,并且RestTemplata不仅支持Rest规范,还可以定义返 ...
- scrapy_简介页面和详情页面
如何对提取的URL进行限定? 往上找id和class属性值,进行多次层级选择,进行内容限定 如何实现获取主页所有urls,然后交给scrapy下载后并解析详情页面,返回结果?(文章简介页面和文章详细页 ...
- Activiti简介
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术 ...
- Linkin大话Java和internet概念
整理电脑,无意中翻到不知道哪里来的文章,觉得里面写的很好,仔细看过一遍后,整理了下贴了出来,其中的好多概念我觉得讲的很透彻. 既然Java不过另一种类型的程序设计语言,为什么还有这么多的人认为它是计算 ...
- 反射应用--IOC和AOP
反射最大的价值就是用来写框架,下面贴出自己的3篇代码,模拟实现SPING框架的bean工厂,IOC,AOP.当然这里重点是在利用反射实现功能,为了图方便,我用的是Properties文件,关于XML后 ...
- Android5.0新控件
谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常用的新控件有下面5种. 1. CardView(卡片视图) CardView顾名思义是卡片视图,它继承FrameLay ...
- [译] Linux吃掉了我的内存
英文原文: https://www.linuxatemyram.com/ 作者: Vidar Holen 译者: thinkam 发生了什么? Linux正借用你未使用的内存来做磁盘缓存.这使你的计算 ...
- HTML学习——标签
1.</hr>效果: 2.<q>简短文本引用, <blockquote>长文本引用, 表象:为文本添加一个双引号,实:一个语义,引用别人的话语. 3.&nb ...
- JavaScript中的类继承
JavaScript是一个无class的面向对象语言,它使用原型继承而非类继承.这会让那些使用传统面向对象语言如C++和Java的程序员们感到困惑.正如我们所看到的,JavaScript的原型继承比类 ...
- iOS项目——自定义UITabBar与布局
在上一篇文章iOS项目——基本框架搭建中,我们详细说明了如何对TabBarItem的图片属性以及文字属性进行一些自定义配置.但是,很多时候,我们需要修改TabBarItem的图片和文字属性之外,还需要 ...