在早期的项目中, 因为需要用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. php对数组进行分页

      3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ...

  2. angular 选中切换面板

    此方法采用的是没有路由的方式: html5 代码: <div [hidden]="flag"> <li class="music-list-datail ...

  3. Android调试错误-No resource identifier found for attribute 'showAsAction'

    转载自:http://www.bubuko.com/infodetail-498830.html 1.问题描述: 24\YoumiAndroidSdk\demo\offers\res\menu\mai ...

  4. spring task 定时

    最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依 ...

  5. jquery判断数据类型和相同字符串不相等

    typeof object返回object对象数据类型 encodeURIComponent(str)//可把字符串作为URI 组件进行编码. 若str1和str2字符串数值相同,encodeURIC ...

  6. JAVA中JPA的主键自增长注解设置

    JPA的注解来定义实体的时候,使用@Id来注解主键属性即可.如果数据库主键是自增长的,需要在增加一个注解@GeneratedValue,即: @GeneratedValue(strategy=Gene ...

  7. test for python urllib

    #!/usr/bin/python import urllib2 import time import logging import threading succCount = 0 failCount ...

  8. Shader 入门笔记(一)

    本笔记,是根据自己学习shader的笔记,主要是参照冯乐乐的<Shader 入门精要> 和游戏蛮牛shaderLad视频 和网上一些博客. 为啥要学习这个呐? 自己其实之前学过一段时间的s ...

  9. linux服务器配置pyspark解决py4j报错等问题

    1.下载spark,python包 略 2.环境变量配置 打开 ~/.bashrc配置文件 如图添加下列环境变量及path 3.退出配置文件,输入 source ~/.bashrc 来执行你添加的一些 ...

  10. linux配置上网

    重装系统之后,配置虚拟机的网络问题花了我三个小时,忘记了网关是vmnet8的IP还是DNS了,搞了很久,后来碰运气碰对了. 寄宿机共享的网络是vmnet8,设置IP,DNS,是vmnet8 的IPv4 ...