flex与JAVA的SOCKET通信.docx
- 文档编号:12472691
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:16
- 大小:41.27KB
flex与JAVA的SOCKET通信.docx
《flex与JAVA的SOCKET通信.docx》由会员分享,可在线阅读,更多相关《flex与JAVA的SOCKET通信.docx(16页珍藏版)》请在冰豆网上搜索。
flex与JAVA的SOCKET通信
flex与JAVA的SOCKET通信
一、准备:
服务端:
JDK1.5(这个不用介绍了吧?
)
服务端IDE:
eclipse(它的主页)
客户端:
FLEX3(Adobe®Flex®3是用于构建和维护在所有主要浏览器、桌面和操作系统一致地部署的极具表现力的Web应用程序的高效率的开放源码框架。
)
客户端IDE:
FlexBuilder3(它的官方摘要页)
二、缘分的相遇(建立连接):
既然是通信,当然第一步就是要建立连接啦。
我们还是用最简单的看代码的方式来开始我们的连接。
==========================================
==服务端代码:
Jserver1.java
==========================================
1.
2.import.*;
3.importjava.io.*;
4.publicclassJserver1{
5.publicstaticvoidmain(String[]args){
6.ServerSocketserver=null;
7.try{
8. server=newServerSocket(719);//在端口719建立一个服务器套接字对象
9. System.out.println("服务端等待");
10. while(true){
11. System.out.println("等待客户机");
12. SocketnewSocket=server.accept();//客户端向我们建立的服务器套接字发送连接请求,则向下执行
13. System.out.println("已与客户机连接");
14. }
15.}catch(IOExceptionie)
16.{
17. System.out.println(ie);
18.}finally{
19. try
20. {
21. if(server!
=null)server.close();//关闭服务器套接字。
为什么要用finally关键字来做这个事呢?
HOHOthinkinginjava里大师已经说得很清楚了,就是无论出现什么异常,都保证我们的服务端套接字能被关闭。
22. }catch(IOExceptionie){}
23.}
24.}
复制代码
嘎嘎,怎么样注释写得够清楚了吧?
OK让我们编译运行,得到的结果应该如图:
OK再让我们来看看客户端的代码是怎么样的:
==========================================
==客户端代码:
Jclient1.mxml
===================================================
1.
2.
xmlversion="1.0"encoding="utf-8"?
>
3. Applicationxmlns: mx="layout="absolute"creatifwidth="349"height="326"> 4. Script> 5. [CDATA[ 6. import.Socket; 7. privatevarsocket: Socket; 8. internalfunctioninitApp(): void 9. { 10. socket=newSocket();//创建Socket对象 11. socket.connect("localhost",719); //连接服务器 12. socket.addEventListener(Event.CONNECT,connectFun);//监听是否连接上服务器 13. socket.addEventListener(Event.CLOSE,closeFun);//监听套接字连接是否关闭 14. 15. } 16. privatefunctionconnectFun(event: Event): void 17. { 18. jText.text+="已经成功连接到服务器! \n"; 19. } 20. 21. privatefunctioncloseFun(event: Event): void 22. { 23. jText.text+="和服务器断开! \n" 24. } 25. ]]> 26. Script> 27. TextAreax="10"y="10"width="327"height="309"id="jText"/> 28. Application> 复制代码 界面非常简单啦,其实就是一个TextArea来显示连接的结果而已,运行的结果如下图(注意,服务端也应该在运行! ): 在as3.0中,所有和网络通信有关的类都位于包中,这里使用的是Socket类对象。 ========================================== ==我们来详细说明一下上面用到的Socket类: ========================================== Socket对象的常用创建方法有下面2种: 1. 2.varsocket: Socket=newSocket();//例一 复制代码 或者 1.varsocket: Socket=newSocket("localhost",719);//例二.这条语句设置了服务器地址为localhost端口是719 复制代码 当指定了了服务器地址和端口,Socket对象将自动开始连接服务器。 如果不指定,则需要条用connect方法才开始执行连接动作,意思就是,例二的代码和下面的代码是等效的: 1. 2.varsocket: Socket=newSocket(); 3.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 ========================================== 1. xmlversion="1.0"encoding="utf-8"? > 2. Applicationxmlns: mx="layout="absolute"fontSize="12"creationComplete="initApp()"> 3. Script> 4. [CDATA[ 5.import.Socket; 6.importflash.utils.ByteArray; 7. 8.privatevarsocket: Socket=newSocket(); //定义Socket,准备好情书的信封 9.//初始化程序 10.internalfunctioninitApp(): void 11.{ 12.socket.connect("localhost",719);//连接服务器 13.socket.addEventListener(Event.CONNECT,funConnect);//监听是否连接 14.socket.addEventListener(Event.CLOSE,funClose);//监听连接关闭 15.} 16.internalfunctionfunConnect(event: Event): void 17.{ 18.myText.text+="连接已建立\n"; 19.} 20.internalfunctionfunClose(event: Event): void 21.{ 22.myText.text+="连接已关闭\n"; 23.} 24. 25.internalfunctionsendMessage(msg: String): void//发送数据对应按钮click事件 26.{ 27.varmessage: ByteArray=newByteArray();//新建一个ByteArray存放数据 28.message.writeUTFBytes(msg+"\r\n");//写入数据,writeUTFBytes方法,以utf-8格式传数据避免中文乱码 29.socket.writeBytes(message); //写入Socket的缓冲区 30.socket.flush(); //调用flush方法发送信息 31.myText.text+=msg+"\r\n"; //在客户端屏幕上输出发送的内容 32.myInput.text="";//清空发言框 33.} 34.]]> 35. Script> 36. TextAreax="10"y="10"width="703"height="263"id="loveText"/> 37. TextInputx="10"y="297"width="605"id="loveInput"/> 38. Buttonx="648"y="297"label="发送情书"id="sendBtn"click="sendMessage(loveInput.text)"/> 39. Application> 复制代码 嘎嘎,情书的做法就上面那面简单,注释已经写得很清楚了,就不多说了。 OK,客户端GG的情书倒是送出去了,我们就来看看服务端MM是怎么接受这封情书的呢? ========================================== ==服务端代码: Jserver2.java ========================================== 1.import.*; 2.importjava.io.*; 3.publicclassJserver2{ 4.privateBufferedReaderreader; //负责输入 5.privateServerSocketserver; //服务器套接字 6.privateSocketsocket; //套接字 7.publicServer2(){} //缺省构造函数 8.voidstartServer() //启动服务器 9.{ 10.try 11.{ 12.server=newServerSocket(719); //创建服务器套接字 13.System.out.println("服务器套接字建立完毕"); 14.while(true) 15.{ 16. System.out.println("等待客户端GG"); 17. socket=server.accept(); //若客户端GG提出连接请求,与socket连接 18. System.out.println("完成与客户端的连接"); 19.reader=newBufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));//获取socket输入流,“utf-8”这个编码设置是为了更好显示中文 20.getMessage();//读取来自客户端的数据,并输出至画面上 21.} 22.}catch(Exceptione) 23.{ 24.System.out.println(e); 25.}finally{ 26.try 27.{ 28.if(server! =null)server.close();//关闭服务器套接字。 29.}catch(IOExceptionie){} 30.} 31.} 32.voidgetMessage() //读取来自套接字的信息 33.{ 34.try 35.{ 36.while(true) //循环 37.{ 38.System.out.println("客户端GG说: "+reader.readLine()); 39.} 40.}catch(Exceptione){} 41.finally{ 42.System.out.println("客户端中断连接"); 43.try 44.{ 45.if(reader! =null)reader.close(); //关闭套接字的输入流 46.if(socket! =null)socket.close(); //关闭套接字 47.reader=null; 48.socket=null; 49.}catch(Exceptione){} 50.} 51.} 52.publicstaticvoidmain(String[]args) 53.{ 54.Server2server=newServer2(); 55.server.startServer(); 56.} 57. 58.} 复制代码 哈哈,我们运行来看看,我们的客户端GG的情书能否顺利到达服务端MM的手中呢? 运行结果如下: HOHO看样子我们的客户端GG的情书,服务端MM是顺利接受到啦。 四、服务端MM的心思(多客户端通信) 在服务端MM收到客户端GG的情书以后,突然发现自己原来还是蛮受欢迎的呢。 但是有句俗话说的好,那就是“不能为了一棵树放弃一片森林”。 所以服务端MM就想,能不能多接受几个客户端GG的情书呢? (真TMD贱。 。 。 ) OK,既然服务端MM有了这个需求(虽然是很贱的需求),那我们就要来满足她! 来看服务端的代码: ========================================= ==Jserver3.java ========================================= 1.import.*; 2.importjava.io.*; 3.importjava.util.*; 4. 5.publicclassJserver3{ 6.privateServerSocketserver; 7.ListsManager=newArrayList(); 8. 9.publicJserver3(){} 10.voidstartServer() //运行服务器 11.{ 12.try { 13.server=newServerSocket(719); 14.System.out.println("服务器套接字已创建成功! "); 15.while(true) 16.{ 17.Socketsocket=server.accept(); 18.System.out.println("已经与客户端连接"); 19.newJ_Thread(socket).start(); 20.sManager.add(socket); 21.System.out.println("当前客户端连结数: "+sManager.size()); 22.} 23.}catch(Exceptione){}finally 24.{ 25.try 26.{ 27.server.close(); 28.}catch(Exceptione){} 29.} 30.} 31.publicstaticvoidmain(String[]args){ 32. 33.Jserver3server=newJserver3(); 34.server.startServer(); 35.} 36.classJ_ThreadextendsThread //与客户端进行通信的线程类 37.{ 38.Socketsocket; //套接字引用变量 39.privateDataInputStreamreader; //套接字输入流 40.privateDataOutputStreamwriter; //套接字输出流 41.J_Thread(Socketsocket) //构造函数 42.{ 43.this.socket=socket; 44.} 45.publicvoidrun() 46.{ 47.try 48.{ 49. 50.reader=newDataInputStream(socket.getInputStream());//获取套接字的输入流 51.writer=newDataOutputStream(socket.getOutputStream());//获取套接字的输出流 52.Stringmsg; 53.while((msg=reader.readUTF())! =null)//如果收到客户端发来的数据 54.{ 55.//向客户端发送信息 56.writer.writeUTF("您的情书已经收到"); 57.writer.flush(); 58.System.out.println("来自客户端: "+msg); 59. 60.} 61.}catch(Exceptione){}finally 62.{ 63.try 64.{ 65.sManager.remove(socket); //删除套接字 66.//关闭输入输出流及套接字 67.if(reader! =null)reader.close(); 68.if(writer! =null)writer.close(); 69.if(socket! =null)socket.close(); 70.reader=null; 71.writer=null; 72.socket=null; 73. 74.System.out.println("客户端离开");//向屏幕输出相关信息 75.System.out.println("当前客户端的连接数: "+sManager.size()); 76.}catch(Exceptione){} 77.} 78.} 79.} 80. 81.} 复制代码 嘎嘎在这段代码里,服务端MM为每一个连接的客户端GG分配一个单独的线程,而每一个线程里都持有对应的客户端GG的Socket对象。 SO,通过这些多线程,服务端MM就练就了一心N用的功力,可以同时接受N个客户端GG发来的情书了( ,真的太贱了。 。 。 。 ) 客户端的代码和上面的客户端代码一模一样的,这里就不多说啦! 好了,在这里就简单的给大家介绍了如何实现java和flash(flex)实现socket通信的简单功能。 有时间的话,再给大家来个简单的聊天室实现(那个时候的服务端MM就更贱了,不仅收着N多客户端GG的情书,竟然还把情书广播给所有的客户端GG,BS! )。 嘎嘎其实原理就是上面所说的这些,大家自己都可以尝试下。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- flex JAVA SOCKET 通信