在早期的项目中, 因为需要用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代码)的更多相关文章

  1. Linux环境下用C语言实现socket 通信---简单代码

    Socket编程实例: 服务器端:一直监听本机的8000号端口,如果收到连接请求,将接收请求并接收客户端发来的消息,并向客户端返回消息. 客户端:client.c /* File Name: clie ...

  2. [转]Flash Socket通信的安全策略

    昨天做测试的时候遇到一个问题,做好的SWF在Flash AS3中调试通过,但是发布到html中之后就无法得到数据了.查了一些资料之后找到了解决办法.这里感谢 剑心 提供帮助,以及同事若水三千提供Jav ...

  3. Flash Socket通信的安全策略问题 843端口

    1.问题描述       将flash发布为html格式后,加载页面后,swf无法与服务器进行socket通信.Flash端显示的错误为:securityErrorHandler信息: [Securi ...

  4. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  5. Socket通信代码(原理)

    1.运行环境:NetBeans IDE 6.0.1 2.说明:先运行服务器端,再运行客户端. 3.服务器端代码: 新建java类Test import java.net.*; import java. ...

  6. 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...

  7. Linux 下socket通信终极指南(附TCP、UDP完整代码)

    linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...

  8. Jmeter自定义编写Java代码调用socket通信

    一.前言 最近需要测试一款手机游戏的性能,找不到啥录制脚本的工具,然后,另外想办法.性能测试实际上就是对服务器的承载能力的测试,和各种类型的手机客户端没有啥多大关系,手机再好,服务器负载不了,也不能够 ...

  9. Socket通信客户端和服务端代码

    这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...

随机推荐

  1. 你知道织梦后台安装插件时为什么会出现这个Character postion 686, 'item'&n

    https://zhidao.baidu.com/question/589525064.html?qbl=relate_question_3&word=Tag Character postio ...

  2. Linux的软件安装(JDK安装,Mysql安装,Tomcat安装)

    1.JDK安装 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看当前Linux系统是否已经安装java 输入 rpm -qa | grep java ps:博主这 ...

  3. Codeforces 448 E. Divisors (DFS,储存结构)

    题目链接:E. Divisors 题意: 给出一个X,f(X)是X所有约数的数列(例6:1 2 3 6),给出一个k,k是递归的次数(例:k=2 : f(f(X)) ; X=4,k=2: 1 1 2 ...

  4. 2017-07-01(ifconfig ifdown ifup netstat )

    ifconfig 可以查看IP地址与子网掩码 ifdown(禁用网卡) ifdown  网络设备名 ifdown eth0 ifup (启动网卡) ifup  网络设备名 ifup  eth0 net ...

  5. Azure CLI对ASM,ARM资源的基本操作

    本文主要介绍Windows Azure CLI对ASM及ARM资源的基本操作 1.在windows的CMD或Powershell环境下,输入命令:azure,可以查看到当前操作的模式为ASM还是ARM ...

  6. js_1_变量类型

    js中有哪些变量类型? 数字(包括int和float),字符串,数组(字典,js没有字典类型,把字典看成一个对象) 如何把字符转成数字呢? obj.parseInt()         //  转化成 ...

  7. 05_Javascript进阶第二天

    String对象 res=str.charAt(1);//返回字符串中第n个字符(输出:i) res=str.charCodeAt(1);//返回第n个字符的ASCII编码(输出:105) res=S ...

  8. nodejs爬虫笔记(三)---爬取YouTube网站上的视频信息

    思路:通过笔记(二)中代理的设置,已经可以对YouTube的信息进行爬取了,这几天想着爬取网站下的视频信息.通过分析YouTube,发现可以从订阅号入手,先选择几个订阅号,然后爬取订阅号里面的视频分类 ...

  9. mysql主从延迟高的原因

    1.1.1故障1:从库数据与主库冲突 1 2 3 4 5 6 show slave status; 报错:且show slave status\G Slave_I/O_Running:Yes Slav ...

  10. CentOS7下 Java、Tomcat、MySQL、Maven热部署

    本文介绍了CentOS7 64位下Java.Tomcat.MySQL.Maven热部署等服务器环境的搭建和调试过程. 学生服务器资源获取方法: 云+校园计划 - 腾讯云 阿里云云翼计划 github ...