背景:在内网访问演示中心的系统结果不能登录进系统,然而此时登录界面也没有能够给出任何提示信息,这样子使系统显得有点不够友好。关于局域网内不能访问演示中心是因为内网屏蔽了Post的访问方式。
--——————系统技术构成——————————
Java+Flex+BlazeDs, FLex框架:Mate
问题:如何在用户不能登录进系统时给出友好的提示?
摸索过程如下:
1、考虑在登录界面xxx.mxml中判断网络连同状况
if(网络连接失败) : 友好提示
谷姐了一番,发现无一例外的都是AIR的例子,大体做法如下:
socketMonitor = new SocketMonitor('www.adobe.com',6667);
socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange);
socketMonitor.start();
或者:
monitor = new URLMonitor(new URLRequest('http://www.adobe.com'));
monitor.addEventListener(StatusEvent.STATUS, announceStatus);
monitor.start();
或者:
var req:URLRequest = new URLRequest( "http://www.adobe.com" );
req.method = URLRequestMethod.HEAD;
monitor = new URLMonitor( req );
onitor.addEventListener( StatusEvent.STATUS, statusHandler );
monitor.start();
参照着这个思路,使用Flex中的URLRequest和URLLoader,想根据URLLoader的load方法的返回值来判断网络是否连通。
尝试未果于是反思:Flex为什么不提供类似AIR下判断连通状态的API?
想了一下觉得FLex而非AIR本身就是用于web的,不联网的话就没意义了(如此理解正确与否尚待商榷... ...),再深入发现自己的思路本身就是错误的,如果能够在login.mxml中才判断那前提条件便是能够访问项目所在的服务器,否则根本就不可能出现登录界面。
汗... ...
弄清楚真正的问题是什么很重要... ...
2、
悬崖勒马(我嚓个去呢,这个貌似也T夸张了点...)
使用Socket方式判断是否可以连接
由于之前在java部分做过socket的局域网练习因此这个倒也不难,大体做法如下:
服务器端(也即Java端):
ServerSocket server = new ServerSocket(port);
while(true){调用server.accept();//accept是个阻塞方法}
客户端(也即FLex端)
Socket client = new Socket();//如果构造函数指定了ip与Port就不需在connect了
client.connect(serverIp,port);
client.addEventListener(Event.CONNECT,funcConnect);
//当然还有close等事件
可以将checkLogin的方法写入funcConnect中,这种思路是没什么问题的,然而现在的问题是我如何将这种Socket方式集成进项目中呢?
欲知后事,请待下回分解... ...
——————————
候补学习——————————————
socket:套接字,用于描述IP地址和端口,是一个通信链的句柄
形象类比: 电话机
每一个socket用一个半相关描述:
(协议,本地地址,本地端口) 一个完整的socket有一个本地唯一的socket号,由操作系统分配。
socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器socket 半相关为全局所公认非常重要。
***********Socket 接口***********
Socket 接口是访问 Internet 使用的最广泛的方法
***********socket原理************
"多孔插座"
***********Java中重要的Socket API************
Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
getOutputStream方法连接的另一端将得到输入,同时返回一个 OutputStream对象实例。注意:其中getInputStream和getOutputStream方法均可能会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
##############如何开发一个Server-Client模型的程序###################
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
&&&&&&&&&&常见的Socket类型&&&&&&&&&&&&&
流式: Socket_Stream TCP
数据报式: Socket_Dgram UDP
实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间
两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。
名词解释:
AF_INET(互联网协议族:TCP/IP): Address Family Internet
AF 表示ADDRESS FAMILY 地址族
PF 表示PROTOCOL FAMILY 协议族
AMF(Action Message Format)是在Flex和Flash中remoting的一种方式格式
基于Http协议,
它的内容处理过程大致是这样:
1.从客户端获取Http请求(Request)流.
2.对流进行解串行化(Deserialize),得到服务器端程序能够识别的数据,并建立一个响应(Response)消息
3.Debug开始
4. 对流进行各种处理(记录、许可、服务)得到返回值
5.对响应流进行串行化
6.发送Http响应给客户端
———————————Flex Java Socket交互——————————————————————
http://space.flash8.net/bbs/viewthread.php?tid=349661&page=1&extra=page%3D1
Flex BlazeDs学习