现在的位置: 首页 > 综合 > 正文

一个flash.net.Socket实例

2013年08月31日 ⁄ 综合 ⁄ 共 3808字 ⁄ 字号 评论关闭

前两天看到http://www.ifbin.com/ 的所有代码开源了。于是迫不及待的下载下来看了一下。顺便推荐一下,这些代码的确都比较不错的。

忽然看到了以前见过的那个使用 flash.net.Socket 包制作的pop3邮件接受的一个例子。当时没有代码,所以只是看了一下。
现在有了代码,于是就看了一下代码。

转入正题:我这篇文章就是把ifbin里面的那个使用flash.net.Socket 作的pop3的例子拿出来,结合一些网络基本知识介绍一下。希望能够起到抛砖引玉的作用。
同时,也探讨一下flash.net.Socket这个包真正的使用意义

首先,我觉得要照顾一下对socket连接不太明白的人:) 简单介绍一下这个概念。如果你清楚这个概念或者觉得这些东西没用,可以直接跳到后面去。
互联网的实现是分为很多层的,可能有些人很清楚7层结构。这里不作深入讨论。但是,我要说一下,大致我们可以把互联网的实现分为3大块:

1,与物理层关系很密切的一层。这层包含多种不同的协议,比如,你在家拨号上网时,物理层协议和你通过以太网上网时的协议是不一样的。但是这对我们不重要。
2,Tcp/IP, 这个层次实际上是几乎整个互联网都用到的而且都在使用的一层。我们的远程网络寻址就是通过这个层次实现的。
3, 应用协议层 这里面是包含了所有我们的网络应用所使用的协议,它是建立在tcp/ip层之上的。比如http(web协议),smtp(邮件发送),pop3(邮件接受)。

我们平时使用flash的时候,可能用过loadMovie,或则loadVar,这些都可以从外部加载内容进入到flash里面。但是,这个过程是通过http协议来完成的。
而我们要讨论的socket实际上是直接建立在刚才讨论过的第二部分。也就是tcp/IP之上。这就要求我们自己需要实现一些应用协议。这里的这个例子就是实现pop3协议的。

好,实际上,说道协议,可能有些人比较陌生,觉得平时没有接触过,没有感性认识。其实,各种建立在tcp/ip层上的协议大多数不是那么深奥。

由于我们这次要对pop3协议进行操作。我就举个例子说明一下pop3协议.
我们打开一个命令行窗口
键入如下:

CODE:[Copy to clipboard]telnet pop.163.com 110

这个命令就是要求连接到pop.163.com 的110端口去。

我们的flash程序也需要连接到这个端口去收信的
如果你的网络连接正常,并且你也正确键入了上面那行。你应该可以看到一个纯黑的窗口
在下面的操作就是在同pop服务器的交互了。注意,在telnet下,你不能用退格键,如果打错了,直接回车,重新输入一遍。

现在输入

CODE:[Copy to clipboard]user yourUserName
这里是 user 命令,语法是
user 空格 你的用户名

然后输入

CODE:[Copy to clipboard]pass yourpassword
这里是 pass 命令,语法是
pass 空格 你的密码

这样你就登录了

然后,用list命令来获取你的信

list
这个命令是用来获取邮件列表的

 

然后,你可以用
retr 邮件号

 

CODE:[Copy to clipboard]retr 408

来获取邮件内容
只不过是以2进制获取到的。还有很多email的标记。

但是,到此为止,你已经可以获取到邮件内容了
写了这么多,还没进入正题呢。真是的:L
不过,为了没有网络基础的人能看明白点,我就这么写吧。

 

今天继续写

那么,下面就该进入正题了。再不进入正题也说不过去了

首先,先把
flash.net.Socket;
flash.utils.ByteArray;
这两个类说一下

Socket这个类是Flash9新支持的。它的作用就是创建一个建立在TCP/IP协议上的socket连接。
什么叫做socket连接呢。一般来说,你要想指定远程计算机上的一个服务,不仅要说明ip地址,还得指名端口号。
ip地址与端口号合起来叫做一个socket,来标示远程计算机上的一个服务。
比如http服务
我们通常看到 12.34.5.6:8080
这样的形势,就是一个套接字,也就是一个socket

所以,你就把socket理解为标示远程服务的ip与端口的组合

在网络上传送的内容都是使用二进制来传送的,
他们实际上属于如下形式中的一种:
Byte,Bytes,Double,Float, Int,Object,Short,UnsignedByte,UnsignedInt,UnsignedShort,UTF,UTFBytes,Boolean

由于pop3协议发送的命令可以用UTFBytes,所以,这里,作者就用了这个类型

 

大家可以看到在一开始,程序先是

                                创建一个新的socket对象

 

CODE:[Copy to clipboard]socket = new Socket();

由于网络调用是异步发生的,因此,像你使用loadVar或者xml.load的时候一样,必须定义一个回叫的方法。
在这里,体现为事件的监听。

 

CODE:[Copy to clipboard]socket.addEventListener( "socketData" , socketDataEvent , false ,0);
这里添加了当data返回时的响应事件。

然后,就是就是当你点击connect的时候,这个connect方法了。

                                他这是在取得文本框里的地址
                                // Assign POP3 server from text input

 

CODE:[Copy to clipboard]POP3Server = pop3Server.text;
然后,通过调用socket的connect方法连接到那个服务器
                                // Connect to server and specify port number

 

CODE:[Copy to clipboard]socket.connect(POP3Server, port);
之后,创建一个ByteArray,这个东西其实就是一个以"位"byte为个体的数组。
                                // Create an instance of flash.utils.ByteArray

 

CODE:[Copy to clipboard]var authentication:ByteArray = new ByteArray();
然后,向这个byteArray中写入字符串,也就是我们的命令。这两个命令大家应该比较熟悉了吧。

// Write UTF string user and pass to ByteArray and terminate with /r/n

 

CODE:[Copy to clipboard]authentication.writeUTFBytes("user " + pop3User.text + "/r/n");

authentication.writeUTFBytes("pass " + pop3Password.text + "/r/n");
最后,由socket把这个内容写到缓冲区
                                // Write ByteArray to socket

 

CODE:[Copy to clipboard]socket.writeBytes(authentication);
把缓冲的内容发送出去
                                // Flushes any accumulated data in the socket's output buffer and sends it to the server

 

CODE:[Copy to clipboard]socket.flush();
剩下的几个方法其实做得是事情都是一样的了。也没什么可说的。

我就先到这里,同时,我也根据这个改写了一个特别简单的ftp的示例。如果你熟悉ftp命令的话,可以拿这个玩一下。

点这里下源码

最后,说一下安全限制

由于flashplayer的安全限制,虽然提供了很强大的socket这个类,但是,对于我们来说,除非你自己做网络游戏或者什么协议,这个东西的通用性并不是很高。
因为你只能连接到自己的服务器,不能够连接到提供服务的那些邮件服务器,ftp服务器等等。

所以,对于我们来说,这个类的实际用途实际上是提高了flash应用程序与服务器交互的灵活性,而并没有给我们提供一个可以连接网络上其他服务的接口。

但是,有一个用途我们是可以利用它的,并且我们也许只能通过这个socket来实现。
那就是 下载某种文档或者内容而不在客户端留下任何缓存。

现在的flash应用程序可能都有一个问题,当需要下载一个保密的文件并且不想让用户在浏览器的缓存中找到它似乎是不可能的。因为不管你用loadVar,loadMovie,XML.load
这些都要在浏览器的缓存中留下这个文件。即使你在http头设置了no cach. 因为是通过浏览器获取的,所以,总会被获取到。

但是,如果你使用socket来获取的话,这个传送只建立与flashplayer与服务器之间,浏览器不参与。因此,可以不留下任何的cach.

抱歉!评论已关闭.