- 浏览: 2675524 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
我素熊猫:
66666666666666
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL -
jonyzhou94:
1987_ming 写道1987_ming 写道System. ...
CXF框架入门实例 -
davidforit:
你那个“2004年Nutch创始人Doug Cutting基于 ...
《Hadoop基础教程》之初识Hadoop -
masuweng:
我的就是这么弄得,到了页面还是那个格式的 。
JSONObject转换JSON--将Date转换为指定格式 -
masuweng:
∑
JSONObject转换JSON--将Date转换为指定格式
- 环境准备
【服务器端】
JDK1.6,“java.net”包对网络编程提供了非常全面的支持,包括Socket
开发环境:Eclipse
【客户端】
Flex4,”flash.net”包也提供了Socket的支持
开发环境:FlashBuilder4
- 实例效果
我是用Java启动一个ServerSocket作为服务器,Flex创建一个页面,当点击页面上的按钮时向Java服务器发送消息。
Flex客户端输入“阿里巴巴”再点击按钮:
Java控制台:
- 注意事项
Flex项目分为两种:一种是普通的本地项目,也就是不依赖其它服务器;另一种是远程服务器项目,这需要依赖其它语言的服务器容器。如果是普通的本地项目,Socket通信是非常容易的,但是如果是远程项目,Socket通信需要考虑Flex安全沙箱问题,后面会详细介绍。
- Java Socket服务器
编写Socket Server代码的步骤通常是:
①创建ServerSocket,定义服务端口号
②使用ServerSocket.accept()监听socket请求,如果有请求会创建一个Socket对象
③通过socket.getInputStream()获取客户端的请求数据
④通过socket.getOutputStream()向客户端返回数据
⑤通过socket.close()结束本次会话
按照上面的步骤,如果有多个客户端向服务器发送请求的话,服务器只会处理第一个请求,其它请求会排队等待,只有第一个请求执行socket.close的时候下一个客户端请求才会运行。为了实现多客户端并发请求,在第②步后面需要建立多线程。
废话不多说,直接代码说明。
首先创建一个SocketUtil类,用于创建ServerSocket和获取Socket
public class SocketUtil { /** * 创建ServerSocket * @param port * @return */ public static ServerSocket getServerSocket(int port){ ServerSocket server = null; try { server = new ServerSocket(port); System.out.println("------ServerSocket创建成功,Port:"+port); return server; } catch (IOException e) { if(server!=null && !server.isClosed()){ try { server.close(); } catch (IOException e1) { e1.printStackTrace(); } } throw new RuntimeException("创建ServerSocket时发生异常,Port:"+port,e); } } /** * 获取Socket * @param server * @return */ public static Socket getSocket(ServerSocket server){ Socket socket = null; try { socket = server.accept(); System.out.println("------Socket连接成功,IP:"+socket.getInetAddress()); return socket; } catch (IOException e) { if(socket!=null && !socket.isClosed()){ try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } } throw new RuntimeException("创建Socket时发送异常",e); } } }
然后创建一个带多线程的类,用于服务器与客户端的IO通信
public class SocketThread implements Runnable { private Socket socket; private String encoding; public SocketThread(Socket socket,String encoding) { this.socket = socket; this.encoding = encoding; } /** * 与客户端交互代码 */ @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket .getInputStream(), encoding)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(), encoding)); String getMsg; while ((getMsg = br.readLine()) != null && !"exit".equalsIgnoreCase(getMsg)) { // 客户端未提出"exit"命令,则循环交流 System.out.println("From client message:" + getMsg); bw.append("你好[" + socket.getInetAddress() + "],服务器收到你的信息:" + getMsg + "\r\n"); bw.flush(); } //客户端提出"exit"请求,关闭当前socket... br.close(); bw.close(); socket.close(); System.out.println("当前Socket连接结束......"); } catch (Exception e) { if(!socket.isClosed()){ try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } } throw new RuntimeException("Socket线程类发送异常...",e); } } }
SocketServer类代码
public class SocketServer implements Runnable { private int port = 10086; private boolean status = true; private ServerSocket server = null; @Override public void run() { //创建Socket服务器 server = SocketUtil.getServerSocket(port); while(status){ Socket socket = SocketUtil.getSocket(server); new Thread(new SocketThread(socket,"UTF-8")).start(); } } /** * 启动服务器 */ public void startSocket(){ new Thread(this).start(); } /** * 关闭服务器 */ public void stopSocket(){ status = false; if(server!=null && !server.isClosed()){ try { server.close(); } catch (IOException e) { e.printStackTrace(); } } } }
最后在Main函数中启动Socket服务即可:
public static void main(String[] args) { new SocketServer().startSocket(); }
- Flex客户端代码
Flex端创建Socket有两种方式:
第一种通过connect方法连接Socket服务器:
var socket:Socket = new Socket(); socket.connect("localhost",10086);第二种通过创建Socket实例时在构造函数中传入服务器ip和端口号连接:
socket = new Socket("localhost",10086);
Flex通过ByteArray传送IO数据,这里有一点稍微注意一下在写入的内容后面会加"\r\n"回车换行符,因为java端是通过BufferedReader.readLine的形式获取一行数据,如果不换行服务器端IO就一直处于阻塞状态:
//ByteArray存放数据 var message:ByteArray = new ByteArray(); //使用UTF形式防止中文乱码 message.writeUTFBytes(txt_socket.text+"\r\n"); //数据写入缓冲区 socket.writeBytes(message);
Flex有多种事件用于监听Socket的状态:
Event.CONNECT:Socket与服务器成功连接时触发的事件 Event.CLOSE:Socket与服务器断开连接时触发的事件 IOErrorEvent.IO_ERROR:Socket通信时发生IO错误时触发的事件 ProgressEvent.SOCKET_DATA:服务器返回数据时触发的事件
新建一个Flex普通项目,入口文件定义为index.mxml,在mxml文件中新建一个textinput文本框用于获取用户输入的内容,button按钮用户发送内容到java socket服务器,一个label用户显示向前socket状态,另一个label用于显示从服务器返回的信息。 index.mxml代码如下:
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Script> <![CDATA[ private var socket:Socket = null; protected function button1_clickHandler(event:MouseEvent):void { if(socket==null || !socket.connected){ //连接服务器(ip,port) socket = new Socket("localhost",10086); //成功连接状态事件 socket.addEventListener(Event.CONNECT,function connFun(e:Event):void{ l_status.text = "Connect to server success..."; }); //连接中断事件 socket.addEventListener(Event.CLOSE,function closeFun(e:Event):void{ l_status.text = "Connect to server closed..."; }); //连接异常事件 socket.addEventListener(IOErrorEvent.IO_ERROR,function closeFun(e:IOErrorEvent):void{ l_status.text = "Connect exception ..."+e.toString(); }); //服务器信息事件 socket.addEventListener(ProgressEvent.SOCKET_DATA,function dataFun(e:ProgressEvent):void{ var getMsg:ByteArray = new ByteArray; socket.readBytes(getMsg); l_result.text = getMsg.toString(); }); } //ByteArray存放数据 var message:ByteArray = new ByteArray(); //使用UTF形式防止中文乱码 message.writeUTFBytes(txt_socket.text+"\r\n"); //数据写入缓冲区 socket.writeBytes(message); //将缓冲区数据发送出去 socket.flush(); //清空文本框内容 txt_socket.text = ""; } ]]> </fx:Script> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <s:Button x="156" y="56" label="按钮" click="button1_clickHandler(event)"/> <s:TextInput x="20" y="56" id="txt_socket"/> <s:Label x="20" y="104" id="l_status"/> <s:Label x="234" y="65" id="l_result"/> </s:Application>
代码编写完成后运行index.mxml文件,最后执行效果就如前面【实例效果】所示。
- 安全沙箱
下面这段是从网上抄的:
----------------------------------------------------------------------------
在 Adobe Flash Player 升级到 9.0.124 后,由于安全策略更改,原来 Socket 或 XmlSocket 的应用里的 http 方式加载安全策略的手段不能继续使用。更改如下:
1, 首先检测目标服务器的 843 端口是否提供安全策略
2, 如果 1 没有检测到策略,则检测 actionscript 是否使用了 Security.loadPolicyFile(xmlsocket://)手段提供安全策略,如果还没检测到,则使用第 3 步检测
3, 检测目标服务器目标端口是否提供安全策略。
1, 首先检测目标服务器的 843 端口是否提供安全策略
2, 如果 1 没有检测到策略,则检测 actionscript 是否使用了 Security.loadPolicyFile(xmlsocket://)手段提供安全策略,如果还没检测到,则使用第 3 步检测
3, 检测目标服务器目标端口是否提供安全策略。
在说具体处理方式前,我先描述一下 Flash Player 的验证过程。在 Flex 程序发出 Socket 或 XmlSocket( 以下统称为 Socket) 请求前, FlashPlayer 会先判断是否为本地调用,如果不是。即用一个 Socket 去链接到你的服务端,三次握手成功后一方面发出字符串“ <policy-file-request/>\0 “另一方面监听返回的安全策略。安全策略接收成功后, FlashPlayer 就断开验证的 Socket ,然后再运行程序本身的 Socket 。在整个 SWF 运行期间,无论你请求多少次,只要域相同, FlashPlayer 就只验证一次。这里有两个重点:
第一个是验证的 Socket 和程序的 Socket 是两个 Socket 。所以你在本地测试时,服务端监听到 N 个 Socket 请求,但布置到服务端后,服务端会监听到 N+1 个请求。
第二是验证的 Socket 发送“ <policy-file-request/>\0 “请求和接收你的策略文件是没有先后关系的,所以你没必要接收完“ <policy-file-request/>\0 “后才发策略文件。我的做法是只要监听到请求,就把策略字符串发过去。
-----------------------------------------------------------------------------------
那么简单的说,如果Flex项目依赖其它语言的服务器的话(比如依赖J2EE服务器),在flex的socket客户端向JavaSocket服务器发送请求之前,Flex会优先发送一个安全验证消息,如果java服务器不返回验证消息则当前socket通信失败。
解决办法有很多种,我在网上也看了很多,但是很多写得有问题。
根据我多方调查,个人觉得这种方案比较靠谱:
在Java服务器端创建一个端口号为843的ServerSocket监听Flex安全沙箱验证消息,如果接收到<policy-file-request/>文件信息,则向客户端返回XMl验证内容:“<?xml version=\"1.0\"?><cross-domain-policy><site-control permitted-cross-domain-policies=\"all\"/><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>\0”
具体代码如下:
/** * 处理与Flex认证的线程类 * @author Administrator */ public class PolicyThread implements Runnable { private final String policy_xml = "<policy-file-request/>"; private final String cross_xml = "<?xml version=\"1.0\"?><cross-domain-policy><site-control permitted-cross-domain-policies=\"all\"/><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>\0"; private Socket socket; public PolicyThread(Socket socket){ this.socket = socket; } @Override public void run() { try { //接收并发送Flex安全验证请求 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream()); char[] by = new char[22]; br.read(by, 0, 22); String s = new String(by); if(s.equals(policy_xml)){ System.out.println("接收policy-file-request认证"); pw.print(cross_xml); pw.flush(); br.close(); pw.close(); socket.close(); System.out.println("完成policy-file-request认证"); } } catch (IOException e) { if(!socket.isClosed()){ try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } } throw new RuntimeException("执行policy认证时发生异常",e); } } }
public class PolicyServer implements Runnable{ private final int policy_port = 843; private boolean status = true; private ServerSocket server = null; @Override public void run() { //创建安全验证服务器 server = SocketUtil.getServerSocket(policy_port); while(status){ Socket socket = SocketUtil.getSocket(server); new Thread(new PolicyThread(socket)).start(); } } /** * 启动服务器 */ public void startPolicy(){ new Thread(this).start(); } /** * 关闭服务器 */ public void stopPolicy(){ status = false; if(server!=null && !server.isClosed()){ try { server.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Flex客户端向Java发送第一次Socket请求(例子里的端口号是10086)时,ServerSocket843端口会收到安全沙箱验证,随后server将正确的验证消息返回给Flex客户端,Flex认证成功后真正的10086端口Socket连结就已经搭建了,随后双方就可以畅通无阻通信了(一次会话只进行一次沙箱验证)。
- Servlet启动ServerSocket
我通常比较喜欢创建一个servlet,在web.xml中配置容器启动时运行servlet的init方法,这样端口号为10086和843的serverSocket就会启动:
public class InitServers extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public InitServers() { super(); } /** * @see Servlet#init(ServletConfig) */ public void init(ServletConfig config) throws ServletException { new PolicyServer().startPolicy(); new SocketServer().startSocket(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
web.xml
<servlet> <display-name>InitServers</display-name> <servlet-name>InitServers</servlet-name> <servlet-class>socket.InitServers</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
以上一个完整的Flex+Java的Socket通信就完成了。
评论
5 楼
w.tany
2016-03-04
谢谢
4 楼
白糖_
2011-11-24
binbinyouli 写道
谢谢你的帮助.你的例子也很好。可以使用。
不谢,有帮助就好
3 楼
binbinyouli
2011-11-24
谢谢你的帮助.你的例子也很好。可以使用。
2 楼
白糖_
2011-11-23
binbinyouli 写道
Main函数中SocketServer从那来?不要笑我,我时菜鸟.
SocketServer代码已添加
1 楼
binbinyouli
2011-11-23
Main函数中SocketServer从那来?不要笑我,我时菜鸟.
发表评论
-
red5+flex实现超简易群聊天功能
2011-08-07 18:22 6302要说这个聊天功能有多简单,大家看图就知道真相了: ... -
red5简介及基础知识
2011-08-06 23:46 4666简介 Red5的主要功能和Macromed ... -
Flex通信-Java服务端通信实例
2011-07-26 11:44 10281Flex与Java通信的方式有很多种,比较常用的有以下方式: ... -
Flex实战-puremvc+java(spring+hibernate)实现增删改查操作
2011-07-25 17:26 4966关键技术简介 Blaseds是一款开源免费的插件, ... -
JAVA(spring/hibernate/blaseds)+Flex整合方案
2011-07-23 07:50 4501实现flex与java通信的 ... -
JAVA(ssh2框架)+Flex实现权限控制方案分析
2011-07-22 14:37 5876目前项目使用的是Struts2+Hibernate+Sp ... -
Flex4基础-组件定位和容器布局
2011-07-22 11:15 21546以下资料部分来自Adobe中文网,但资料年代已久,根据我自己的 ... -
Flex4基础-ActionScript语法
2011-07-21 21:23 4624简介 Flex ... -
blazeds实现java到flex类映射
2011-07-02 14:28 4572最近在学习flex与java交互的技术,其中flex可以通过r ... -
Flex4消息提示框Alert
2011-06-28 20:57 12460在任何BS项目中,消息提示框都是非常常见的功能组件,flex在 ...
相关推荐
综上所述,"flexjava-sockete.rar"文件可能包含了一个使用FlexJava进行Socket通信的实例,涵盖了从基础的Socket连接创建到数据传输、异常处理以及可能的多线程和安全性方面的内容。通过学习和实践这个项目,开发者...
本篇文章将详细介绍如何利用Flex和Java进行Socket通信,并通过具体的实例展示整个过程。 #### 二、基础知识 在深入讨论之前,我们需要先了解一些关于Socket的基础知识。 - **Socket**是一种用于网络通信的技术,...
在本文中,我们将深入探讨如何实现Flex客户端与Java服务器之间的Socket通信。 首先,确保你拥有以下环境和工具: 1. 服务端:JDK 1.5 或更高版本,用于编写Java代码。 2. 服务端IDE:例如Eclipse,便于Java开发。 3...
根据提供的代码示例,我们可以看到 Flex + Java 实现 Socket 通信的具体实现细节。 ##### 1. **Java 服务端实现** 服务端主要通过 `SimpleServer` 类实现,该类使用 Java 的 Socket API 进行开发。具体来说: - `...
Flex+Java+Socket 实例源码聊天室是一个典型的网络通信应用,它结合了Adobe Flex作为前端用户界面技术,Java作为后端服务器处理技术,并利用Socket进行实时的数据传输。这个项目对于学习和理解客户端与服务器之间的...
总的来说,Flex Socket通信是跨平台应用开发中一种强大的通信手段,它允许Flex前端与Java后端无缝协作,实现复杂、高效的数据交互。在实际项目中,根据需求选择合适的通信方式,并充分考虑性能、安全性和可扩展性,...
在这个“java+flex基于socket的聊天案例”中,我们将深入探讨如何利用Java作为服务器端技术,Flex作为客户端展示层,通过Socket通信实现一个简单的聊天应用程序。 Java在后台处理业务逻辑和网络通信,它提供了...
Flex Java Socket文字聊天是一种基于Adobe Flex前端技术和Java后端Socket通信技术实现的实时文本聊天应用。这个应用允许用户通过网络进行双向通信,提供了一个简单但功能完备的平台,让用户能够发送和接收即时消息。...
这个示例对于理解Flex和Java之间的Socket通信以及Java的多线程Socket服务端设计模式非常有帮助。它展示了如何在实际应用中实现高效、可扩展的网络通信,这对于开发实时聊天、在线游戏等需要实时交互的Web应用至关...
在实现Flex与Socket通信时,开发者需要注意错误处理,例如网络中断、服务器崩溃等情况。同时,为了保护用户隐私和数据安全,还需要考虑加密传输和身份验证机制。此外,性能优化也是重要的一环,例如通过缓存和批量...
本文将通过一个具体的Java Socket编程实例来深入探讨如何使用Java实现客户端与服务端之间的通信。 #### 二、基础知识概述 在开始具体实例之前,我们需要了解一些基本概念: - **Socket**:Socket是一种用于在网络...
- BlazeDS或LiveCycle Data Services:Adobe提供的中间件,允许Flex应用程序与Java或.NET服务进行数据交换,包括Socket通信。 2. **C#服务端开发**: - `System.Net.Sockets.Socket`类:用于创建和管理Socket连接...
Flex和Java交互主要涉及到的是客户端与服务器端的数据通信技术,其中Socket通信是一种常见的网络编程方式。Flex是一款基于Adobe AIR或Flash Player运行时的开放源代码框架,主要用于构建富互联网应用程序(RIA)。而...
在Java中,我们使用`java.net.ServerSocket`和`java.net.Socket`类来实现服务端和客户端的Socket通信。 1. **创建ServerSocket**:在服务端,我们创建一个ServerSocket实例,指定监听的端口,如`ServerSocket ...
总结来说,这个实例展示了如何利用Java Socket技术和Flex的图表组件创建一个实时数据可视化应用。Java服务器负责收集和发送数据,而Flex客户端负责接收数据并动态更新图表。这样的系统在监控、数据分析、仪表板等...
4. **Socket通信**:聊天应用通常需要实时通信,Flex可以使用Socket API来实现客户端和服务器之间的双向通信。 5. **多用户同步**:聊天实例需要处理多个用户同时在线聊天的情况,因此,数据同步和并发控制是关键,...
在IT行业中,Flex和Java的组合常常用于构建...它涉及到Flex和ActionScript的UI设计与交互实现,Java的数据处理和通信,以及网络拓扑图的可视化展示。对于想要学习或改进此类应用的开发者来说,这是一个很好的学习资源。
总的来说,使用Flex实现邮件发送涉及客户端的UI设计、网络通信以及与后端服务的交互。通过ActionScript编程,我们可以构建一个直观的用户界面,并通过HTTPService与后端服务器配合,完成邮件的发送功能。在这个过程...
在IT领域,尤其是在网络编程中,Flex和Java的Socket通信是一种常见的技术,用于实现客户端和服务器之间的双向数据传输。在本案例中,我们将深入探讨如何使用Flex(一个用于构建富互联网应用程序的框架)和Java的...