[AS3]BaseSocket类-可以提升Socket数据传输效率
需要Flash Player 9.0或更高版本的支持
原理就是结合AMF3和ByteArray的特性对原来数据进行压缩后再传输,这样就可以大大提高数据传输效率。
我现在把客户端方法进行优化,现在写成一个BaseSocket类来方便调用。
BaseSocket类
-
-
-
-
-
-
-
-
- package
com.klstudio.socket {
-
- import
flash.events.*;
- import
flash.net.Socket;
- import
flash.net.ObjectEncoding;
- import
flash.system.Security;
- import
flash.utils.ByteArray;
-
- public
class
BaseSocket
extends
EventDispatcher{
-
- private
var _host:String;
- private
var _port:uint;
- private
var _socket:Socket;
-
- public
function BaseSocket(host:String, port:uint =
80
) {
- this
._host = host;
- this
._port = port;
- this
._socket =
new
Socket();
- this
._socket.objectEncoding = ObjectEncoding.AMF3;
- Security.loadPolicyFile("xmlsocket://"
+
this
.host +
":"
+
this
.port);
- this
._socket.addEventListener(Event.CONNECT, handler);
- this
._socket.addEventListener(Event.CLOSE, handler);
- this
._socket.addEventListener(IOErrorEvent.IO_ERROR, handler);
- this
._socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handler);
- this
._socket.addEventListener(ProgressEvent.SOCKET_DATA, handler);
- }
-
- public
function get host():String {
- return
_host;
- }
-
- public
function get port():uint {
- return
_port;
- }
-
- public
function get connected():Boolean {
- return
this
._socket.connected;
- }
-
- public
function connect():
void
{
- this
._socket.connect(host, port);
- }
-
- public
function close():
void
{
- this
._socket.close();
- }
-
- public
function send(params:Object=
null
):
void
{
- if
(!
this
.connected || params ==
null
){
- return
;
- }
- var bytes:ByteArray = new
ByteArray();
- bytes.writeObject(params);
- bytes.compress();
- this
._socket.writeBytes(bytes);
- this
._socket.flush();
- this
.dispatchEvent(
new
BaseSocketEvent(BaseSocketEvent.SENDING, params));
- }
-
- private
function received():
void
{
- var bytes:ByteArray = new
ByteArray();
- while
(
this
._socket.bytesAvailable >
0
) {
- this
._socket.readBytes(bytes,
0
,
this
._socket.bytesAvailable);
- }
- try
{
- bytes.uncompress();
- this
.dispatchEvent(
new
BaseSocketEvent(BaseSocketEvent.RECEIVED, bytes.readObject()));
- }catch
(error:Error) {
- this
.dispatchEvent(
new
BaseSocketEvent(BaseSocketEvent.DECODE_ERROR));
- }
- }
-
- private
function handler(event:Event):
void
{
- switch
(event.type) {
- case
Event.CLOSE:
- this
.dispatchEvent(
new
BaseSocketEvent(BaseSocketEvent.CLOSE));
- break
;
- case
Event.CONNECT:
- case
IOErrorEvent.IO_ERROR:
- case
SecurityErrorEvent.SECURITY_ERROR:
- this
.dispatchEvent(
new
BaseSocketEvent(event.type));
- break
;
- case
ProgressEvent.SOCKET_DATA:
- this
.received();
- break
;
- }
- }
- }
- }
BaseSocketEvent类
-
-
-
-
-
-
-
-
- package
com.klstudio.socket {
-
- import
flash.events.*;
-
- public
class
BaseSocketEvent
extends
Event {
-
- public
static
const
SECURITY_ERROR:String = SecurityErrorEvent.SECURITY_ERROR;
- public
static
const
IO_ERROR:String = IOErrorEvent.IO_ERROR;
- public
static
const
DECODE_ERROR:String =
"decode_error"
;
- public
static
const
RECEIVED:String =
"received"
;
- public
static
const
SENDING:String =
"sending"
;
- public
static
const
CLOSE:String = Event.CLOSE;
- public
static
const
CONNECT:String = Event.CONNECT;
-
- private
var _data:Object;
-
- public
function BaseSocketEvent(type:String, data:Object =
null
) {
- super
(type,
true
);
- this
._data = data;
- }
-
- public
function get data():Object {
- return
_data;
- }
-
- override public
function toString():String {
- return
formatToString(
"BaseSocketEvent"
,
"type"
,
"bubbles"
,
"cancelable"
,
"data"
);
- }
-
- override public
function clone():Event {
- return
new
BaseSocketEvent(type, data);
- }
- }
-
- }
调用实例
-
-
-
-
-
-
- package
project.test {
-
- import
flash.display.*;
- import
flash.events.*;
- import
flash.text.TextField;
-
- import
com.klstudio.data.Map;
- import
com.klstudio.socket.BaseSocket;
- import
com.klstudio.socket.BaseSocketEvent;
-
- public
class
TestGame
extends
Sprite {
- private
var _socket:BaseSocket;
- private
var _id:uint;
- private
var _lists:Map;
- private
var _info:TextField;
- public
function TestGame() {
- _info = new
TextField();
- _info.selectable = false
;
- _info.text = "未连接"
;
- addChild(_info);
-
- stage.addEventListener(MouseEvent.MOUSE_UP, stageHandler);
- _lists = new
Map();
- _socket = new
BaseSocket(
"localhost"
,
110
);
- configureListeners(_socket);
- _socket.connect();
- }
-
- private
function configureListeners(dispatcher:IEventDispatcher):
void
{
- dispatcher.addEventListener(BaseSocketEvent.CLOSE, handler);
- dispatcher.addEventListener(BaseSocketEvent.CONNECT, handler);
- dispatcher.addEventListener(BaseSocketEvent.IO_ERROR, handler);
- dispatcher.addEventListener(BaseSocketEvent.SECURITY_ERROR, handler);
- dispatcher.addEventListener(BaseSocketEvent.SENDING, handler);
- dispatcher.addEventListener(BaseSocketEvent.RECEIVED, handler);
- dispatcher.addEventListener(BaseSocketEvent.DECODE_ERROR, handler);
- }
-
- private
function handler(event:BaseSocketEvent):
void
{
- switch
(event.type) {
- case
BaseSocketEvent.RECEIVED:
- receive(event.data);
- break
;
- case
BaseSocketEvent.CLOSE:
- debug("连接关闭"
);
- removeAll();
- break
;
- case
BaseSocketEvent.CONNECT:
- debug("连接中..."
);
- _socket.send( { event:"init"
} );
- break
;
- case
BaseSocketEvent.IO_ERROR:
- case
BaseSocketEvent.SECURITY_ERROR:
- debug("连接失败"
);
- break
;
- case
BaseSocketEvent.DECODE_ERROR:
- debug("解码失败"
);
- break
;
- }
- }
-
- private
function stageHandler(event:MouseEvent):
void
{
- _socket.send( { event:"move"
, x:
this
.mouseX, y:
this
.mouseY } );
- }
-
- private
function receive(object:Object):
void
{
- switch
(object.event) {
- case
"init"
:
- init(object.id);
- for
(var i:uint =
0
; i < object.list.length; i++ ) {
- var item:Object = object.list[i];
- add(item.id, item.x, item.y);
- }
- break
;
- case
"move"
:
- move(object.id, object.x, object.y);
- break
;
- case
"remove"
:
- remove(object.id);
- break
;
- case
"add"
:
- add(object.id);
- break
;
- }
- }
-
- private
function init(id:uint):
void
{
- this
._id = id;
- add(id);
- }
-
- private
function add(id:uint, x:Number = undefined, y:Number = undefined):
void
{
- x = x || stage.stageWidth / 2
;
- y = y || stage.stageHeight / 2
;
- if
(_lists.containsKey(id)) {
- return
;
- }
- var role:GameRole = new
GameRole(id,_id == id);
- role.move(x,y);
- addChild(role);
- _lists.put(id, role);
- }
-
- private
function move(id:uint, x:Number, y:Number):
void
{
- if
(_lists.containsKey(id)) {
- var role:GameRole = _lists.get(id);
- role.to(x, y);
- }
- }
-
- private
function remove(id:uint):
void
{
- if
(_lists.containsKey(id)) {
- var role:GameRole = _lists.remove(id);
- trace(role);
- if
(
this
.contains(role)) {
- removeChild(role);
- }
- role = null
;
- }
- }
-
- private
function removeAll():
void
{
- var keys:Array = _lists.keys;
- for
(var i:uint =
0
; i < keys.length; i++ ) {
- var role:GameRole = _lists.remove(keys[i]);
- if
(
this
.contains(role)) {
- removeChild(role);
- }
- role = null
;
- }
- }
-
- private
function debug(msg:String):
void
{
- _info.text = msg;
- trace(msg);
- }
-
- }
-
- }
分享到:
相关推荐
Objective-C是一种强大的面向对象的编程语言,特别是在Apple的iOS和Mac OS X平台上广泛使用。...通过实践和研究提供的Demo,你可以更好地掌握Objective-C中Socket编程的细节,从而提升你的iOS和Mac开发技能。
【计算机网络实验--基于Socket的消息传输程序的实现】 在计算机网络中,Socket是一种通信接口,它允许...通过这些步骤,可以实现基于Socket的消息传输程序,允许两台或多台计算机通过TCP/IP网络进行高效可靠的通信。
这些示例通常会涵盖Socket的创建、连接、数据传输以及错误处理等方面,对于初学者来说是非常有价值的参考资料。 总结,cocos2d-x结合Socket网络通信,能构建出高性能、实时的网络游戏。通过理解和实践上述知识点,...
在实际应用中,了解TCP-UDP-Socket调试工具的使用方法和原理,能够极大地提升开发和运维人员的效率,有效地解决网络通信中的问题,保证服务的稳定性和可靠性。通过这款工具,我们可以模拟不同的网络环境,测试应用...
标题中的“Modbus-Tcp采用Socket与NModbus两种方式”指的是在实现基于Modbus-TCP协议的通信时,采用了两种不同的技术手段:Socket编程和使用NModbus库。这两种方法都是为了与支持Modbus-TCP协议的设备进行数据交换。...
实际应用中,可能还需要考虑文件的分块传输、断点续传、错误重传等高级特性,以提高传输效率和可靠性。在进行文件传输时,确保正确处理数据流的读写、网络异常以及资源管理,是编写可靠程序的关键。
- **性能优化**:合理设置缓冲区大小,避免频繁的小规模数据传输,提高通信效率。 通过这个项目,开发者可以学习到如何跨越语言边界,利用Socket实现不同平台之间的通信。这不仅对理解网络编程原理有帮助,也为构建...
而socket是网络编程中的基本组件,用于在不同设备之间建立连接并传输数据。 在cocos2d-x中实现socket连接封装,主要是为了在游戏中实现实时的网络通信功能,比如多人在线对战、实时同步游戏状态或者服务器推送更新...
- UDP应用可以利用SuperSocket的多线程处理和缓冲区管理机制,提高数据处理效率。 - 开发者可以通过定义自定义协议解析器,方便地处理UDP数据包。 **SuperSocket核心组件** 1. **Server**: 作为服务端的核心,...
Socket数据传输,实现了网路数据传输和局域网数据传输,有前端和客户端,对了解多线程有好处,不好之处请评分指教。:-) 补充(在ClientTest类里有一段代码如下: System.out.println("文件接收了" + (passedlen * ...
通过上述步骤,我们可以构建一个基于HPSocket的UDP传输客户端,高效地接收和处理矿用产量数据。这样的系统对于实时监控、数据分析和决策支持具有重要价值。在实际应用中,还需考虑安全性、负载均衡、容错机制等多...
通过这种方式,开发者可以专注于业务逻辑,而不是关注底层操作系统的差异,提高开发效率和代码可维护性。 总之,“跨平台的socket库,windows-linux-socket”是一个旨在消除操作系统差异的工具,它通过抽象和封装...
对于开发者而言,TCP-UDP-SocketTool这样的工具能够极大地提高网络通信调试的效率,尤其是在开发网络应用或解决网络问题时。通过它,我们可以直观地看到数据在网络中的流动,理解TCP和UDP的工作原理,以及如何利用...
通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将...
2. 数据传输速率测试:测试在一定时间内服务器处理和传输数据的速度,评估带宽利用率。 3. 稳定性测试:长时间运行压力测试,检查系统是否会出现内存泄漏、性能下降等问题。 4. 错误恢复测试:模拟网络异常情况,如...
端口工具TCP-UDP-Socket2.2.3简略版是一款专为软件和硬件开发者设计的测试...通过使用这个工具,开发者可以更深入地理解TCP和UDP协议的工作原理,以及如何利用Socket进行有效通信,从而提升开发工作的效率和专业水平。
2. Socket类:客户端使用Socket类建立到服务器的连接,并通过getInputStream()和getOutputStream()获取输入流和输出流,实现数据传输。 3. InputStream和OutputStream:Socket通信的基础,分别用于读取和写入数据。...
Socket.io则是一个强大的实时应用程序框架,它允许在客户端和服务器之间进行实时双向通信,支持多种传输协议,确保数据的可靠传输。 Koa的核心特性在于其使用了ES6的类和生成器(generator),这使得错误处理更加...
本项目“C#开发的Socket数据传输项目”就是专注于利用C#语言实现Socket服务,以实现客户端和服务端之间的实时通信功能。下面我们将深入探讨相关知识点。 首先,Socket是计算机网络中的接口,它允许两个程序通过网络...