在早期的项目中, 因为需要用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. Java Servlet API中文说明文档

    Java Servlet API中文说明文档 目 录 1.... Servet资料 1.1      绪言 1.2      谁需要读这份文档 1.3      Java Servlet API的组成 ...

  2. linux tcp重传多会导致软中断在各个核很不均匀么?

    网络不稳定,会导致某些核的软中断很高么?那么,下面我们来分析下这个论断的准确性. 环境描述: 网卡软中断进行了绑核.设备具备80个核,960个网卡中断,没开启bbr,全部是tcp呼叫. # cat / ...

  3. 【问题处理】mysql sleep 连接数过多

    睡眠连接过多,会对mysql服务器造成什么影响?严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃.造成睡眠连接过多的原因?1. 使用了太多持久连接(个人觉得,在高并发系统 ...

  4. Spring切面优先级

    项目中有两个切面,这两个切面都作用于同一个方法,哪个先执行哪个后执行呢,所以要定义一个切面的优先级 import java.util.Arrays; import org.aspectj.lang.J ...

  5. Spring-事务配置和详解

    一.Spring事务配置 在项目开发过程中经常会使用事务来确保数据的一致性.根据网上的资料整理一下在spring中配置事务的几种方式.无论是哪种方式都需要在配置文件中配置连接池和事务管理器,代码如下. ...

  6. Intellij-@Override报错

    1.设置  File >> Project Structure >> Project 中设置Project language level如下: 2. 设置  File > ...

  7. .NET: 谈谈共享项目 (Shared Project) 的使用

    从 Visual Studio 2015 起,共享项目 (Shared Project) 作为新的一种项目类型被添加到项目模板列表中,它的主要目的是使多个不同类型的项目之间可以共享代码或资源.相比它的 ...

  8. Django rest framework:__str__ returned non-string (type NoneType) 真正原因

    出错原因: 用户表是Django中核心的表,当这个表类字段中有一个这样的函数 def __str__(self): return self.name 在Django用户表设计时候有个字段容易犯这个失误 ...

  9. linux根据端口号查询来源程序

    1.根据端口号查询进程  netstat -tunlp|grep port 2.根据进程查询来源程序 ps aux | grep pid 上图看出所属进程为2281 上图看出占用8083端口的程序为n ...

  10. POI--帮助文档

    1.创建工作簿 (WORKBOOK) HSSFWorkbook wb = new HSSFWorkbook(); FileOutputStream fileOut = new FileOutputSt ...