`
hrp091pt
  • 浏览: 10615 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

java与flex通信

 
阅读更多

java与flex通信
2010年10月22日
  一、准备:
  服务端:JDK1.5 (这个不用介绍了吧?) 服务端IDE:eclipse (它的主页) 客户端:FLEX 3 (Adobe?? Flex?? 3 是用于构建和维护在所有主要浏览器、桌面和操作系统一致地部署的极具表现力的 Web 应用程序的高效率的开放源码框架。) 客户端IDE:Flex Builder 3 (它的官方摘要页)  二、缘分的相遇(建立连接):
  既然是通信,当然第一步就是要建立连接啦。我们还是用最简单的看代码的方式来开始我们的连接。 ========================================== ==服务端代码:Jserver1.java ========================================== 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 让我们编译运行,得到的结果应该如图: OK 再让我们来看看客户端的代码是怎么样的: ========================================== ==客户端代码:Jclient1.mxml ================================================== =        复制代码 界面非常简单啦,其实就是一个TextArea来显示连接的结果而已,运行的结果如下图(注意,服务端也应该在运行!): 在as3.0中,所有和网络通信有关的类都位于flash.net包中,这里使用的是Socket类对象。 ========================================== ==我们来详细说明一下上面用到的Socket类: ========================================== Socket对象的常用创建方法有下面2种: var socket:Socket=new Socket();//例一 复制代码 或者 var socket:Socket=new Socket("localhost",719);//例二.这条语句设置了服务器地址为localhost 端口是719 复制代码 当指定了了服务器地址和端口,Socket对象将自动开始连接服务器。如果不指定,则需要条用connect方法才开始执行连接动作,意思就是,例二的代码和下面的代码是等效的: 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 ==========================================          复制代码 嘎嘎,情书的做法就上面那面简单,注释已经写得很清楚了,就不多说了。 OK,客户端GG的情书倒是送出去了,我们就来看看服务端MM是怎么接受这封情书的呢? ========================================== ==服务端代码:Jserver2.java ========================================== 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(); } } 复制代码 哈哈,我们运行来看看,我们的客户端GG的情书能否顺利到达服务端MM的手中呢? 运行结果如下: HOHO 看样子我们的客户端GG的情书,服务端MM是顺利接受到啦。  四、服务端MM的心思(多客户端通信)
  在服务端MM收到客户端GG的情书以后,突然发现自己原来还是蛮受欢迎的呢。但是有句俗话说的好,那就是"不能为了一棵树放弃一片森林"。所以服务端MM就想,能不能多接受几个客户端GG的情书呢?(真TMD贱。。。) OK,既然服务端MM有了这个需求(虽然是很贱的需求),那我们就要来满足她! 来看服务端的代码: ========================================= ==Jserver3.java ========================================= 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){} } } } } 复制代码 嘎嘎 在这段代码里,服务端MM为每一个连接的客户端GG分配一个单独的线程,而每一个线程里都持有对应的客户端GG的Socket对象。SO,通过这些多线程,服务端MM就练就了一心N用的功力,可以同时接受N个客户端GG发来的情书了( ,真的太贱了。。。。) 客户端的代码和上面的客户端代码一模一样的,这里就不多说啦!  好了,在这里就简单的给大家介绍了如何实现java和flash(flex)实现socket通信的简单功能。有时间的话,再给大家来个简单的聊天室实现(那个时候的服务端MM就更贱了,不仅收着N多客户端GG的情书,竟然还把情书广播给所有的客户端GG,BS!)。嘎嘎 其实原理就是上面所说的这些,大家自己都可以尝试下。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics