利用套接字机制实现Flash和数据库连接(2)
2008-04-02 11:02:03来源:互联网 阅读 ()
跟随一个成功的连接,该前端发送一SQL命令,他还在消息中包含了连接句柄。一旦接收一个SQL命令,后端将提取属于该连接句柄的认证信息并且使用他把该命令发送到数据库。
前端所发送的打开一个连接的XML消息具备下列格式:
<flashLogon>
<IPAddr>127.0.0.1</IPAddr>
<Login>sa</Login>
<Password>admin_password</Password>
<Database>user_database</Database>
</flashLogon>
请注意,这里的前端有两个IP地址域:一个持有IP地址或Java应用程式正在其上运行(端口号1024)的服务器的DNS名,而另外一个持有数据库服务器的IP地址;上面的<IPAddr>引用了数据库服务器。
处理一个SQL命令的消息有下列格式:
<flashCommand>
<Command>SELECT * FROM Table1</Command>
<Connection>1</Connection>
</flashCommand>
假如连接是成功的,Java服务器应用程式将返回下列消息:
<Connection>
<HConnection>1</HConnection>
</Return>
处理一个命令后,返回一条类似于下面的消息:
<Return>
120
</Return>
然而,这条消息也可能更复杂些,例如:
<Return>
Michaels,Rich,1200,10962 Acacia St
King,Mary,98012,11128 Maryland Ave
</Return>
他更有可能包含一条错误消息,例如:
<Return>
SQL Error 101 Table does not exist.
</Return>
三、 构建前端
现在,我们分析一下本文源码中的SocketGUI.fla文档。在Frame0中,我装载了后台代码文档(GlobalFrame0.as)。其中,Frame1包含GUI元素。在Frame1中的任何的按钮事件处理器简单地参考在GlobalFrame0.as中的方法。
Connect函数处理针对'Connect'按钮的点击功能。我使用XMLSocket的connect函数并使用端口1024(这可能是大于或等于1024的任何16位数)来试图打开一个到Java应用程式的连接。
使用XMLSocket打开一个连接分两步:首先,调用connect方法;然后Flash调用onConnect事件处理器以通知该应用程式试图连接的成功或失败;在这个处理器中,您必须加入代码来处理试图打开该连接的结果。
为使连接完全成功,在我们的示例应用程式中,必须确保到Java应用程式的XMLSocket.connect调用成功执行,并且数据库认证也要成功执行。假如这两个条件都满足,那么该Java应用程式将返回一个XML编码的连接数字,并把他存储在HConnection变量中。当Flash收到来自服务器的消息时,XMLSocket的onData事件将激发。当然,可能收到不同的响应消息:一个成功的连接将收到一个连接数字,而一个数据库命令将收到一条来自数据库的消息。ParseReturn函数决定收到的响应的种类并且根据这一响应继续执行下去。
假如连接成功,现在用户就能把一条命令发送到数据库;这一功能是在SendCommand函数中实现的,他就象调用XMLSocket.send相同简单。
Connect和SendCommand都需要适当格式化消息以便Java应用程式理解他们(上面描述的XML格式)。XMLCreateLogon和XMLCreateCommand正是完成此任务。您将注意到,每个消息需要被一个换行符字符终止('\n'),否则Java服务器套接字不会接收此消息。
有关Flash编码所剩下的唯一的事情是断开功能;为了实现断开连接,您能够按下'Disconnect'按钮或在命令行上发送一个'disconnect'消息。任何的功能(基本上是从集合中删除数据库认证和句柄)在服务器应用程式中实现;在Flash中,我仅重置了连接句柄。
四、 构建后端
Java后端应用程式有两部分:一个'listener'类(称作oSckSrv),他使用Java套接字来接收来自Flash的XML命令和一个'executor'类(称作dbConn),他实现实际的数据库通讯功能。
该Java应用程式的核心是个无限循环(参考在oSckSrv.java文档中的主循环部分)。他简单地在端口1024上等待接收一连接请求,一旦收到连接请求,立即使用一个流读取器来读取该XML消息。在试用了各种读取器后,我发现BufferedReader Java类最适当于接收文本(XML)字符串。然后,parseReceivedXML函数被调用以解释该消息。这个函数使用文档对象模型API来分析从Flash收到的XML文档。
假如收到一'logon'消息,那么dbConn类的getConnection函数被调用以试图打开到数据库的连接。假如收到一'command'消息,那么程式代码将分析是否该XML消息嵌入一个有效的(现有)连接句柄。假如该句柄有效,dbConn用于传送从Flash中收到的SQL消息。
dbConn类负责实现实际的数据库工作。假如您对JDBC熟悉,或有其他协议的使用经验,例如ODBC甚至ADO,那么这部分代码就很容易理解。Connect函数使用认证参数打开一到数据库的连接,但是真正有趣的函数是Execute,他使用接收自Flash前端的SQL命令串,并且把他传递给数据库服务器的引擎来以任何方式处理他。显然,Flash和Java都不知道发送给数据库的消息;仅由数据库服务器来理解他!
Execute函数把来自于数据库服务器的XML格式的输出返回到调用者(oSckSrv),由他再把该输出传送回前端。该消息必须以一个'\0'终止,以便Flash的XMLSocket正确接收他。
在我的dbConn编程中,我使用了Microsoft SQL Server数据库。然而,您能够很容易地看到,该Java应用程式不必直接连接到一个数据库,一个数据库服务器或一个数据库平台。假如您想要连接到除SQL Server以外的数据库服务器,您需要修改该代码以加载适当的JDBC驱动程式并且通过前端提供适当的连接参数。您更有可能需要在Flash前端添加一个'database type'参数来帮助服务器代码决定在运行时刻装载哪个驱动程式。
我必须承认,为了简单一些,我做了点"小动作"。您会在ActionScript代码中注意到,在调用XMLSocket的send方法之前,我再次打开该连接。我本来能够让该连接打开并准备接收更多的请求(经由ino缓冲读取器);然而,ServerSocket类的accept方法正被阻塞,这意味着在允许进一步的处理前他将等待另一个连接请求;同时,假如我等待ino.readLine接收来自于一个已连接的客户的更多的命令,那么该Java应用程式就不会服务来自于其他客户的连接请求。我现在使用的编程方式是,一旦收到一个连接请求,该请求即被服务并且由服务器关上该TCP/IP连接(这正是一旦该Flash应用程式连接或把一个命令提交到该Java应用程式就显示'Connection closed'消息的原因);然后,该应用程式返回以等待另一个连接请求。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: Excel转成Flash
下一篇: 一些动作的简单解析5:起身
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
