- 浏览: 337137 次
- 性别:
- 来自: 广州
文章分类
最新评论
一、准备:
服务端:JDK1.5 (这个不用介绍了吧?)
服务端IDE:eclipse (它的主页 )
客户端:FLEX 3 (Adobe® Flex® 3 是用于构建和维护在所有主要浏览器、桌面和操作系统 一致地部署的极具表现力的 Web 应用程序 的高效率的开放源码 框架。)
客户端IDE:Flex Builder 3 (它的官方摘要页 )
二、缘分的相遇(建立连接):
既然是通信,当然第一步就是要建立连接啦。我们还是用最简单的看代码 的方式来开始我们的连接。
==========================================
==服务端代码:Jserver1.java
==========================================嘎嘎,怎么样 注释写得够清楚了吧?OK 让我们编译运行,得到的结果应该如图:复制代码
- import java.net.*;
- import java.io.*;
- public class Jserver1 {
- public static void main(String[] args) {
- ServerSocket server=null;
- try{
- server=new ServerSocket(719);//在端口719建立一个服务器 套接字对象
- System.out.println("服务端等待");
- while(true){
- System.out.println("等待客户机");
- Socket newSocket=server.accept();//客户端向我们建立的服务器套接字发送连接请求,则向下执行
- System.out.println("已与客户机连接");
- }
- }catch(IOException ie)
- {
- System.out.println(ie);
- }finally{
- try
- {
- if(server!=null) server.close();//关闭服务器套接字。为什么要用finally关键字来做这个事呢?HOHO thinking in java里大师已经说得很清楚了,就是无论出现什么异常,都保证我们的服务端套接字能被关闭。
- }catch(IOException ie){}
- }
- }
OK 再让我们来看看客户端的代码是怎么样的:
==========================================
==客户端代码:Jclient1.mxml
===================================================界面非常简单啦,其实就是一个TextArea来显示连接的结果而已,运行的结果如下图(注意,服务端也应该在运行!):复制代码
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creati f width="349" height="326">
- <mx:Script>
- <![CDATA[
- import flash .net.Socket;
- private var socket:Socket;
- internal function initApp():void
- {
- socket=new Socket();//创建Socket对象
- socket.connect("localhost",719); //连接服务器
- socket.addEventListener(Event.CONNECT,connectFun);//监听是否连接上服务器
- socket.addEventListener(Event.CLOSE,closeFun);//监听套接字连接是否关闭
- }
- private function connectFun(event:Event):void
- {
- jText.text+="已经成功连接到服务器!/n";
- }
- private function closeFun(event:Event):void
- {
- jText.text+="和服务器断开!/n"
- }
- ]]>
- </mx:Script>
- <mx:TextArea x="10" y="10" width="327" height="309" id="jText"/>
- </mx:Application>
在as3.0中,所有和网络通信有关的类都位于flash.net包中,这里使用的是Socket类对象。
==========================================
==我们来详细说明一下上面用到的Socket类:
==========================================
Socket对象的常用创建方法有下面2种:或者复制代码
- var socket:Socket=new Socket();//例一
当指定了了服务器地址和端口,Socket对象将自动开始连接服务器。如果不指定,则需要条用connect方法才开始执行连接动作,意思就是,例二的代码和下面的代码是等效的:复制代码
- var socket:Socket=new Socket("localhost",719);//例二.这条语句设置了服务器地址为localhost 端口是719
完成连接动作后,接下来要获取服务端得返回信息。复制代码
- var socket:Socket=new Socket();
- socket.connect("localhost",719);
Socket对象和URLLOADER啊之类的对象都是一样,利用事件机制来处理服务器端的信息,我们只要给Socket对象添加相关的事件监听函数就可以捕捉到服务器端的信息,Socket对象的事件主要有:
1 Event.CLOSE 连接中断事件。
2 Event.CONNECT 连接状态事件,表示已经成功连接了服务器。
3 IOErrorEvent.IO_ERROR 信息传递错误事件,一般是由服务器地址错误引起的。
4 ProgressEvent.SOCKET_DATA 服务器信息事件,当收到服务器的新信息时被触发。
==========================================
哈哈,经过上面的代码,我们的服务端MM和客户端GG终于通过Socket这个缘分宿命的相遇了!接下来会发生什么?我们继续往下看~~
三、第一封情书(客户端发送消息,服务端接受消息)
客户端GG在遇到服务端MM以后,终日变得茶饭不思,在折磨掉了无数根头发以后,客户端GG终于下定决心,要向服务端MM送出第一封情书啦!
既然是客户端GG送出情书,那我们先来看他到底是怎么做的:
==========================================
==客户端代码:Jclient2.mxml
==========================================嘎嘎,情书的做法就上面那面简单,注释已经写得很清楚了,就不多说了。复制代码
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" creationComplete="initApp()">
- <mx:Script>
- <![CDATA[
- import flash.net.Socket;
- import flash.utils.ByteArray;
- private var socket:Socket=new Socket(); //定义Socket,准备好情书的信封
- //初始化程序
- internal function initApp():void
- {
- socket.connect("localhost",719); //连接服务器
- socket.addEventListener(Event.CONNECT,funConnect); //监听是否连接
- socket.addEventListener(Event.CLOSE,funClose); //监听连接关闭
- }
- internal function funConnect(event:Event):void
- {
- myText.text+="连接已建立 /n";
- }
- internal function funClose(event:Event):void
- {
- myText.text+="连接已关闭 /n";
- }
- internal function sendMessage(msg:String):void//发送数据对应按钮click事件
- {
- var message:ByteArray=new ByteArray();//新建一个ByteArray存放数据
- message.writeUTFBytes(msg +"/r/n");//写入数据,writeUTFBytes方法,以utf-8格式传数据避免中文乱码
- socket.writeBytes(message); //写入Socket的缓冲区
- socket.flush(); //调用flush方法发送信息
- myText.text+=msg+"/r/n"; //在客户端屏幕上输出发送的内容
- myInput.text=""; //清空发言框
- }
- ]]>
- </mx:Script>
- <mx:TextArea x="10" y="10" width="703" height="263" id="loveText"/>
- <mx:TextInput x="10" y="297" width="605" id="loveInput"/>
- <mx:Button x="648" y="297" label="发送情书" id="sendBtn" click="sendMessage(loveInput.text)"/>
- </mx:Application>
OK,客户端GG的情书倒是送出去了,我们就来看看服务端MM是怎么接受这封情书的呢?
==========================================
==服务端代码:Jserver2.java
==========================================哈哈,我们运行来看看,我们的客户端GG的情书能否顺利到达服务端MM的手中呢?复制代码
- import java.net.*;
- import java.io.*;
- public class Jserver2{
- private BufferedReader reader; //负责输入
- private ServerSocket server; //服务器套接字
- private Socket socket; //套接字
- public Server2(){} //缺省构造函数
- void startServer() //启动服务器
- {
- try
- {
- server=new ServerSocket(719); //创建服务器套接字
- System.out.println("服务器套接字建立完毕");
- while(true)
- {
- System.out.println("等待客户端GG");
- socket=server.accept(); //若客户端GG提出连接请求,与socket连接
- System.out.println("完成与客户端的连接");
- reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8")); //获取socket输入流,“utf-8”这个编码设置是为了更好显示中文
- getMessage();//读取来自客户端的数据,并输出至画面上
- }
- }catch(Exception e)
- {
- System.out.println(e);
- }finally{
- try
- {
- if(server!=null) server.close();//关闭服务器套接字。
- }catch(IOException ie){}
- }
- }
- void getMessage() //读取来自套接字的信息
- {
- try
- {
- while(true) //循环
- {
- System.out.println("客户端GG说:"+reader.readLine());
- }
- }catch(Exception e){}
- finally{
- System.out.println("客户端中断连接");
- try
- {
- if(reader!=null) reader.close(); //关闭套接字的输入流
- if(socket!=null) socket.close(); //关闭套接字
- reader=null;
- socket=null;
- }catch(Exception e){}
- }
- }
- public static void main(String[] args)
- {
- Server2 server=new Server2();
- server.startServer();
- }
- }
运行结果如下:
HOHO 看样子我们的客户端GG的情书,服务端MM是顺利接受到啦。
四、服务端MM的心思(多客户端通信)
在服务端MM收到客户端GG的情书以后,突然发现自己原来还是蛮受欢迎的呢。但是有句俗话说的好,那就是“不能为了一棵树放弃一片森林”。所以服务端MM就想,能不能多接受几个客户端GG的情书呢?(真TMD贱。。。)
OK,既然服务端MM有了这个需求(虽然是很贱的需求),那我们就要来满足她!
来看服务端的代码:
=========================================
==Jserver3.java
=========================================嘎嘎 在这段代码里,服务端MM为每一个连接的客户端GG分配一个单独的线程,而每一个线程里都持有对应的客户端GG的Socket对象。SO,通过这些多线程,服务端MM就练就了一心N用的功力,可以同时接受N个客户端GG发来的情书了( ,真的太贱了。。。。)复制代码
- import java.net.*;
- import java.io.*;
- import java.util.*;
- public class Jserver3 {
- private ServerSocket server;
- List sManager = new ArrayList();
- public Jserver3(){}
- void startServer() //运行服务器
- {
- try
- {
- server=new ServerSocket(719);
- System.out.println("服务器套接字已创建成功!");
- while(true)
- {
- Socket socket=server.accept();
- System.out.println("已经与客户端连接");
- new J_Thread(socket).start();
- sManager.add(socket);
- System.out.println("当前客户端连结数:"+sManager.size());
- }
- }catch(Exception e){}finally
- {
- try
- {
- server.close();
- }catch(Exception e){}
- }
- }
- public static void main(String[] args) {
- Jserver3 server=new Jserver3();
- server.startServer();
- }
- class J_Thread extends Thread //与客户端进行通信的线程类
- {
- Socket socket; //套接字引用变量
- private DataInputStream reader; //套接字输入流
- private DataOutputStream writer; //套接字输出流
- J_Thread(Socket socket) //构造函数
- {
- this.socket=socket;
- }
- public void run()
- {
- try
- {
- reader=new DataInputStream(socket.getInputStream());//获取套接字的输入流
- writer=new DataOutputStream(socket.getOutputStream());//获取套接字的输出流
- String msg;
- while((msg=reader.readUTF())!=null)//如果收到客户端发来的数据
- {
- //向客户端发送信息
- writer.writeUTF("您的情书已经收到");
- writer.flush();
- System.out.println("来自客户端:"+msg);
- }
- }catch(Exception e){}finally
- {
- try
- {
- sManager.remove(socket); //删除套接字
- //关闭输入输出流及套接字
- if(reader!=null)reader.close();
- if(writer!=null)writer.close();
- if(socket!=null)socket.close();
- reader=null;
- writer=null;
- socket=null;
- System.out.println("客户端离开");//向屏幕输出相关信息
- System.out.println("当前客户端的连接数:"+sManager.size());
- }catch(Exception e){}
- }
- }
- }
- }
客户端的代码和上面的客户端代码一模一样的,这里就不多说啦!
好了,在这里就简单的给大家介绍了如何实现java和flash(flex )实现socket通信的简单功能。有时间的话,再给大家来个简单的聊天室实现(那个时候的服务端MM就更贱了,不仅收着N多客户端GG的情书,竟然还把情书广播给所有的客户端GG,BS!)。嘎嘎 其实原理就是上面所说的这些,大家自己都可以尝试下。
转:http://blog.csdn.net/as_leon/article/details/5351713
发表评论
-
Mina重连
2014-05-26 21:29 2906import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6351.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 591一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 774安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1228使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 449ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1145http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 899不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 860http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 500http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 986http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 671http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 599http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 807http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 941http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 411http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 564http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 833当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 1013目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
本篇文章将详细介绍一个最简单的Java与Flex通信的实例,并提供完整的实现步骤。 1. **Flex简介**: Flex是Adobe公司推出的一种基于ActionScript的开源框架,用于创建富互联网应用程序(RIA)。它使用MXML和...
在“JavaFlex项目”这个压缩包中,很可能包含了使用Java和Flex进行通信的示例代码,包括Java端的服务实现、BlazeDS配置以及Flex端的HTTPService或WebService调用。通过分析和学习这些代码,你可以更好地理解和掌握...
### 使用BlazeDS实现Java和Flex通信:详细指南与步骤 BlazeDS是Adobe公司推出的一款开源工具,它充当了一座桥梁,使后端的Java应用程序能够与前端的Adobe Flex应用程序进行实时通信。通过BlazeDS,开发者可以构建出...
### 使用BlazeDS实现Java与Flex通信的关键知识点 #### 一、引言 随着Web技术的发展,前后端的通信方式也变得越来越多样化。其中,Flex作为一种流行的应用开发框架,经常被用于构建丰富的互联网应用程序(RIA)。...
这个"java+flex通信源码"项目提供了一个实际的、完整的示例,演示了如何利用BlazeDS技术实现Java后端与Flex前端的无缝交互。下面我们将深入探讨相关的知识点。 首先,Flex是一种基于ActionScript的开放源代码框架,...
此外,理解MXML和ActionScript的数据绑定机制,以及Java中的序列化和反序列化过程,对于实现高效的JAVA与FLEX通信至关重要。 总之,通过MyEclipse整合JAVA与FLEX,可以构建出功能强大的、用户体验丰富的Web应用。这...
Flex和Java之间的通信是Web应用程序开发中的一个重要环节,它允许前端用户界面(UI)与后端服务器进行数据交互。Flex是一种基于Adobe Flash Player或Adobe AIR运行时的富互联网应用程序(RIA)开发框架,而Java则是...
### Flex与Java实现通信——使用BlazeDS技术详解 #### 一、引言 随着互联网技术的不断发展,前端与后端之间的数据交换变得越来越频繁。Adobe Flex作为一种强大的RIA(Rich Internet Applications)技术,广泛应用...
#### Java与Flex通信 - **创建服务类型(Service Class Type)** 实现Flex直接调用Java的方法需要创建实现了`cn.smartinvoke.IServerObject`接口的服务类。 - 使用`Eclipse`工具栏中的相应图标创建服务类型。 - ...
1. BlazeDS:BlazeDS是Adobe官方提供的一个免费的中间件,它允许Java服务器与Flex客户端之间进行实时双向通信。BlazeDS支持AMF(Action Message Format)协议,这是一种高效的二进制数据格式,能大幅减少网络传输...
通过使用AMF(Action Message Format)或其他数据交换格式,如JSON或XML,Java服务器可以与Flex客户端进行高效的数据通信。这种方式允许Flex应用程序充分利用Java的强大计算能力和企业级服务,同时保持富媒体和交互...
1. **Java环境配置**:首先,你需要在Java环境中安装 BlazeDS 或 LCDS(LiveCycle Data Services),这两个是Adobe提供的服务器组件,它们提供了与Flex通信的AMF通道。BlazeDS是开源的,而LCDS是商业版本,具有更多...
这个“使用BlazeDS实现Java和Flex通信之hello world”示例旨在介绍如何通过BlazeDS来实现简单但关键的客户端-服务器交互。下面我们将详细探讨BlazeDS、Flex以及它们之间的通信机制,并通过“hello world”实例来具体...
描述中的"java与flex通信"进一步强调了这个主题,意味着压缩包的内容将专注于讲解Flex客户端如何与Java服务器进行数据交换。这种通信通常涉及到HTTP服务、AMF(Action Message Format)或者WebSocket等技术。 在...
通过使用RESTful API或者SOAP Web服务,Java可以与Flex前端进行通信,传递数据和指令。 Flex作为前端,主要利用Adobe Flash Player或Adobe AIR运行,为用户提供动态、响应式的UI体验。它使用MXML和ActionScript语言...