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 ...
随机推荐
- Java Servlet API中文说明文档
Java Servlet API中文说明文档 目 录 1.... Servet资料 1.1 绪言 1.2 谁需要读这份文档 1.3 Java Servlet API的组成 ...
- linux tcp重传多会导致软中断在各个核很不均匀么?
网络不稳定,会导致某些核的软中断很高么?那么,下面我们来分析下这个论断的准确性. 环境描述: 网卡软中断进行了绑核.设备具备80个核,960个网卡中断,没开启bbr,全部是tcp呼叫. # cat / ...
- 【问题处理】mysql sleep 连接数过多
睡眠连接过多,会对mysql服务器造成什么影响?严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃.造成睡眠连接过多的原因?1. 使用了太多持久连接(个人觉得,在高并发系统 ...
- Spring切面优先级
项目中有两个切面,这两个切面都作用于同一个方法,哪个先执行哪个后执行呢,所以要定义一个切面的优先级 import java.util.Arrays; import org.aspectj.lang.J ...
- Spring-事务配置和详解
一.Spring事务配置 在项目开发过程中经常会使用事务来确保数据的一致性.根据网上的资料整理一下在spring中配置事务的几种方式.无论是哪种方式都需要在配置文件中配置连接池和事务管理器,代码如下. ...
- Intellij-@Override报错
1.设置 File >> Project Structure >> Project 中设置Project language level如下: 2. 设置 File > ...
- .NET: 谈谈共享项目 (Shared Project) 的使用
从 Visual Studio 2015 起,共享项目 (Shared Project) 作为新的一种项目类型被添加到项目模板列表中,它的主要目的是使多个不同类型的项目之间可以共享代码或资源.相比它的 ...
- Django rest framework:__str__ returned non-string (type NoneType) 真正原因
出错原因: 用户表是Django中核心的表,当这个表类字段中有一个这样的函数 def __str__(self): return self.name 在Django用户表设计时候有个字段容易犯这个失误 ...
- linux根据端口号查询来源程序
1.根据端口号查询进程 netstat -tunlp|grep port 2.根据进程查询来源程序 ps aux | grep pid 上图看出所属进程为2281 上图看出占用8083端口的程序为n ...
- POI--帮助文档
1.创建工作簿 (WORKBOOK) HSSFWorkbook wb = new HSSFWorkbook(); FileOutputStream fileOut = new FileOutputSt ...