AS3实现通过HTTP代理进行Socket连接

AS3, 网络连接 | 2010年07月4日 上午 4:37 | RSS 2.0

最近在做的应用需要考虑到各种网络环境,于是在面对教育网等环境时就需要连接代理。
AS3目前还没有内置网络代理API,于是自己顺手写了一套。
目前只有HTTP代理+Socket连接,不久后会放出HTTP代理+HTTP连接的部分(其实是还没写:-P)
如果更有空一些,会写Sock5代理+Socket连接/HTTP连接的部分,不过不要期望太高就是了。

下面是正文。

总体来说,实现的很简单,使用起来也很简单,在创建实例的时候传递代理服务器地址、端口,然后当普通Socket类用就可以了。
(当然,建议在侦听事件时用ProxyEvent.CONNECT替代Event.CONNECT,因为对于HTTPProxySocket类来说,前者才真正表示已连接到目标服务器)


首先是HTTPProxySocket类,位于org.swfdong.net.proxy包下。

/********************************
HTTP Proxy Socket Class
Author:Swfdong
Date:2010-07-04

http://blog.swfdong.org

********************************/
package org.swfdong.net.proxy {
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.ProgressEvent;
import flash.net.Socket;
import org.swfdong.net.events.ProxyEvent;
public class HTTPProxySocket extends Socket{
private var _proxyHost:String;
private var _proxyPort:int;
private var _ua:String;
private var _host:String;
private var _port:int;
public function HTTPProxySocket(host:String,port:uint=80,ua:String="Swfdong Proxy"):void {
_proxyHost=host;
_proxyPort=port;
_ua=ua;
}
//连接
override public function connect(host:String,port:int):void{
_host=host;
_port=port;
super.connect(_proxyHost,_proxyPort);
super.addEventListener(Event.CONNECT,connectHandler,false,0,true);
}
//关闭连接
override public function close():void{
super.removeEventListener(Event.CONNECT,connectHandler);
super.close();
}
//Getter
//代理主机&端口
public function get proxyHost():String{
return _proxyHost;
}
public function get proxyPort():int{
return _proxyPort;
}
//UserAgent
public function get userAgent():String{
return _ua;
}
//目标主机&端口
public function get host():String{
return _host;
}
public function get port():int{
return _port;
}
//连接侦听
private function connectHandler(e:Event):void{
super.writeUTFBytes("CONNECT "+_host+":"+_port+" HTTP/1.0\r\nUser-Agent: "+_ua+"\r\nHost: "+_host+"\r\nContent-Length: 0\r\nProxy-Connection: Keep-Alive\r\n\r\n");
super.removeEventListener(Event.CONNECT,connectHandler);
super.addEventListener(ProgressEvent.SOCKET_DATA,proxyStateHandler,false,0,true);
super.flush();
}
//代理状态侦听
private function proxyStateHandler(e:ProgressEvent):void{
var event:ProxyEvent;
var response:String=super.readUTFBytes(super.bytesAvailable);
super.removeEventListener(ProgressEvent.SOCKET_DATA,proxyStateHandler);
if(response.lastIndexOf("established")!=-1){
event=new ProxyEvent(ProxyEvent.CONNECTED);
}else{
event=new ProxyEvent(ProxyEvent.ERROR);
}
dispatchEvent(event);
}
}
}

然后是位于org.swfdong.net.events包下的ProxyEvent类:

/********************************
Proxy Event
Author:Swfdong
Date:2010-07-04

http://blog.swfdong.org

********************************/
package org.swfdong.net.events {
import flash.events.Event;
public class ProxyEvent extends Event{
public static const CONNECTED:String="proxy-connected";
public static const ERROR:String="proxy-error";
public function ProxyEvent(type:String) {
super(type);
}
}

}

愿意直接下载源码+示例的点这里(源文件要求版本:Flash CS4)
[转载请勿直接盗链]
HTTPProxySocket.zip

本文在天地会上同样发了一份,地址如下:
http://bbs.9ria.com/thread-57902-1-1.html

Tags: , ,

“AS3实现通过HTTP代理进行Socket连接” 目前有 3 条回应

  1. TonySan 说道:

    这个代理是什么原理? socket 连接时,用代理服务器IP和端和进行连接吗?

留下回复