Java-Flex通信

   背景:在内网访问演示中心的系统结果不能登录进系统,然而此时登录界面也没有能够给出任何提示信息,这样子使系统显得有点不够友好。关于局域网内不能访问演示中心是因为内网屏蔽了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学习

你可能感兴趣的:(java,socket,网络协议,Flex,AIR)