`
279135628
  • 浏览: 13107 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于flex+java+socket的开发

阅读更多
兄弟我最近在研究flex+java+socket,第一次交互已经完成了,客户端请求策略文件,服务器发送策略文件给客户端,解决了沙箱安全的问题,但是碰到一个很奇怪的问题   就是客户端和服务端通讯了一次后(策略请求不算)    服务端就得不到客户端的消息了    一直会卡在server.accept()   也就是在等客户端的请求   但是我明明已经发了请求过去了  想请教下各位。。。。
以下是java服务端
package com.medou;

import java.io.*;
import java.net.*;

public class Server {

   private ServerSocket server;
   private BufferedReader reader;
   private BufferedWriter writer;
   Socket client;
   private String xml;
   
   public Server() 
   {
     xml="<?xml version=\"1.0\"?><cross-domain-policy><site-control permitted-cross-domain-policies=\"all\"/>"
        +"<allow-access-from domain=\"*\" to-ports=\"*\"/>"
     +"</cross-domain-policy>";
     System.out.println(xml);
     //启动843端口
     createServerSocket(843);
   }

   //启动服务器
   private void createServerSocket(int port)
   {
     try {
       server = new ServerSocket(port);
       System.out.println("服务监听端口:" + port);
       while(true) {
        //接收客户端的连接
         client = server.accept();
         InputStreamReader input = new InputStreamReader(client.getInputStream(), "UTF-8");
         reader = new BufferedReader(input);
         OutputStreamWriter output = new OutputStreamWriter(client.getOutputStream(), "UTF-8");
         writer = new BufferedWriter(output);
         //读取客户端发送的数据
         StringBuilder data = new StringBuilder();
         char[] a = new char[50];
         System.out.println("11111");
         int j = reader.read(a);
         for(int i=0;i<j;i++) {
        	 System.out.print(a[i]+",");
        	 if (a[i] != '\0') {
                 data.append(a[i]);
               } else {
            	   break;
               }
         }
         String info = data.toString();
         System.out.println("输入的请求: " + info);
         
         //接收到客户端的请求之后,将策略文件发送出去
         if(info.indexOf("<policy-file-request/>")>=0)
         {
           writer.write(xml + "\0");
           writer.flush();
           writer.close();
           reader.close();
           client.close();
         }
         else
         {
          System.out.println("dasdas");
           writer.write("0");
           writer.flush();
         }
       }
       } catch (Exception e) {
         e.printStackTrace();
         } finally {
           //调用垃圾收集方法
        	 try  
             {
        	 if(reader != null){
                 reader.close();
                 reader=null;
             }
        	 System.out.println("dad");
             if(writer != null){
                 writer.close();
                 writer=null;
             }
             if (client != null) {
                 client.close();
                 client = null;
               }
         } catch(Exception ie){}   
           //System.gc();
         }
       }
   //测试主函数
   public static void main(String[] args)
   {
     new Server();
   }
}

以下是flex客户端
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
	creationComplete="initApp()">
	<mx:Script>
		<![CDATA[
import flash.net.Socket;
import flash.utils.ByteArray;
import flash.events.ProgressEvent;
private var socket:Socket;
private var intClient:int;//定义客户端数字出拳
private var intServer:int;//定义服务端数字出拳
private var intSY:int;//定义输赢判断
private var strClient:String;//客户端文字出拳
private var strServer:String;//服务端的文字出拳
internal function initApp():void
{
//Security.loadPolicyFile("http://localhost:9000/crossdomain.xml");
//Security.loadPolicyFile("xmlsocket://localhost:8888");
socket=new Socket();//创建Socket对象
socket.connect("localhost",843);//连接服务器
socket.addEventListener(Event.CONNECT,funConnect);//监听是否连接上服务器
socket.addEventListener(Event.CLOSE,funClose);//监听套接字连接是否关闭
//socket.addEventListener(ProgressEvent.SOCKET_DATA,funSocket);//监听服务器的新信息
}
internal function funConnect(event:Event):void
{
myText.text+="连接已建立\n";
}

internal function funClose(event:Event):void
{
myText.text+="连接已关闭\n";
}
internal function sendMessage(msg:String):void
{
	 try{
socket.writeUTFBytes(msg);
socket.flush();
}catch(e:IOError){//没有连上服务器就发送数据,会发生IOError异常
       trace("未连接服务器");
}
intClient=int(msg);
switch(intClient)//将数字转换成文字用于发布到屏幕上
{
case 0:
strClient="剪刀";
break;
case 1:
strClient="锤";
break;
case 2:
strClient="包袱";
break;
}
myText.text+="你出:"+strClient+"\n";
//myInput.text="";
}
internal function funSocket(event:ProgressEvent):void//接到服务器信息
{
var msg:String="";
while(socket.bytesAvailable) {
	msg+=socket.readUTFBytes(socket.bytesAvailable);
}
socket.writeUTFBytes("2");
socket.flush();
myInput.text=msg;
intServer=int(msg);
intSY=intClient-intServer;//通过数值判断输赢
switch(intServer)//将数字转换成文字用于发布到屏幕上
{
case 0:
strServer="剪刀";
break;
case 1:
strServer="锤";
break;
case 2:
strServer="包袱";
break;
}
myText.text+="服务器出:"+strServer+"\n";
//判断输赢的算法
if(intSY>0&&intSY<2)
{
myText.text+="结果:你赢了\n";
}else if(intClient==intServer)
{
myText.text+="结果:平手\n";
}else if(intSY<0&&intSY>-2)
{
myText.text+="结果:你输了\n";
}else if(intSY>=2)
{
myText.text+="结果:你输了\n";
}else if(intSY<=-2)
{
myText.text+="结果:你赢了\n";
}
myText.verticalScrollPosition = myText.maxVerticalScrollPosition;// myText滚动到最下面
}
		]]>
	</mx:Script>
<mx:TextArea x="10" y="32" width="331" height="263" id="myText"/>
<mx:TextInput x="10" y="303" width="245" id="myInput"/>
<mx:Button x="273" y="304" label="发送" id="myBtn" click="sendMessage(myInput.text)"/>
<mx:Label x="10" y="10" text="规则:0代表剪刀;1代表锤;2代表包袱" width="331" fontWeight="bold"/>
</mx:Application>

分享到:
评论
9 楼 mp_juan 2010-11-22  
貌似是你服务器端代码写的有问题:
   while(true){
    Socket s=serverSocket.accept();
    DataOutputStream response=new DataOutputStream(s.getOutputStream());
response.write(content.getBytes());
response.flush();
s.shutdownOutput();    

}
你试下这样
8 楼 unbounder 2010-11-20  
换一个端口
如果采用这种策略文件的方式,不需要使用843端口,任何一个端口只要服务器将策略文件发给客户端,就可以解决安全沙盒问题。
7 楼 raodun 2010-11-20  
童鞋你的沙箱安全问题并未解决
6 楼 cjnetwork 2010-11-20  
flex平台socket在连接服务器的时候会默认去843端口验证安全策略,如果验证通过,flex客户端程序的socket可以正常使用,否则客户端socket将会自动关闭。
所以似乎不应该在843执行逻辑处理,可以开别的端口处理逻辑,服务器端的843端口只需要提供安全策略文件,然后验证结束后关闭就可以了。
引用

服务器端需要增加843端口监听服务的
当Flex客户端要与目标端口建立套接字通讯时,Flex的SCOKRT机制会先去访问服务器端的843端口发出" <policy-file-request/>",查询是否提供安全策略文件
" <?xml version=\"1.0\"?>
<cross-domain-policy>
<site-control permitted-cross-domain-policies=\"all\"/>
<allow-access-from domain=\"*\" to-ports=\"*\"/>
</cross-domain-policy>\0";
5 楼 coreymylive 2010-11-19  
smithfox 写道
你说的 "客户端和服务端通讯了一次后" 一次完整应答吗?
accpet函数是client发起新建连接时, 才会触发, 但从你的mxml来看, 你是一次连接, 多次应答的长连接模式.



楼上是正解,你的initapp只在程序初始化的时候执行握手,不过后面也不是长连接,明显,接收一次字符以后,就断掉了连接。
4 楼 smithfox 2010-11-19  
你说的 "客户端和服务端通讯了一次后" 一次完整应答吗?
accpet函数是client发起新建连接时, 才会触发, 但从你的mxml来看, 你是一次连接, 多次应答的长连接模式.
3 楼 279135628 2010-11-19  
有没有人啊  晕死
2 楼 279135628 2010-11-19  
没有人知道吗
1 楼 279135628 2010-11-19  
达人来帮助    谢谢

相关推荐

    Flex+Java+Socket 实例源码 聊天室

    总之,Flex+Java+Socket聊天室实例源码提供了一个学习和实践网络编程、客户端-服务器通信以及富互联网应用程序开发的宝贵机会。通过研究和修改这个项目,开发者可以深入理解相关技术,并具备构建类似应用的能力。

    flex+java的socket通信

    ### Flex + Java 的 Socket 通信知识点解析 #### 一、概览 在现代软件开发中,前后端分离架构越来越受到青睐。...以上就是关于 Flex + Java 的 Socket 通信的详细介绍,希望对理解和实现此类项目有所帮助。

    FLEX+Delphi,FLEX+Java,FLEX+C# 的聊天室

    设置服务端IP和端口 &lt;br&gt;----------------------------- chat 客户端代码 FLEX3 开发 ChatServer Delphi6 开发的服务端 Server java 开发的服务端 WindowsApplication1 C# 开发的服务端 &lt;br&gt;...

    JsSocket,JS+FLEX+JAVA模拟的Js Soclet

    JsSocket 是使用js + flex + java开发的一套基于web的socket通信组件 主要解决大家在开发web项目时需要用到前台与后台时时通信时的问题,除了HTML5的WebSocket之外,之前大家使用的方法一般为:1、页面间断刷新;2、...

    Flex+Java开发拓扑图

    本项目"Flex+Java开发拓扑图"是一个利用Flex作为前端展示层,Java作为后端数据处理层来实现动态拓扑图的应用实例。 Flex是一种基于ActionScript(AS)的开源框架,主要用于创建富互联网应用程序(RIA)。它允许...

    Flex+java上传开发工具包

    Flex+Java上传开发工具包是用于构建Web应用中文件上传功能的一种技术组合。在这个工具包中,主要包括两个关键的库文件:comm-fileupload1.2.jar和comm-io.jar。这两个库文件分别扮演着不同的角色,共同协作以实现...

    flex与java采用socket方式通信

    标题中的“flex与java采用socket方式通信”是指在开发分布式应用程序时,使用Adobe Flex作为前端UI框架,通过Socket协议与Java后端服务器进行数据交互的一种技术实现。Flex是一款基于ActionScript的开源框架,用于...

    java+flex基于socket的聊天案例

    在这个“java+flex基于socket的聊天案例”中,我们将深入探讨如何利用Java作为服务器端技术,Flex作为客户端展示层,通过Socket通信实现一个简单的聊天应用程序。 Java在后台处理业务逻辑和网络通信,它提供了...

    Flex和java的socket通信

    ### Flex和Java的Socket通信详解 #### 一、引言 在互联网应用开发中,不同技术栈之间的通信是非常重要的一个环节。本篇文章将详细介绍如何利用Flex和Java进行Socket通信,并通过具体的实例展示整个过程。 #### 二...

    FLEX与JAVA通过SOCKET通信

    总的来说,Flex与Java通过Socket通信涉及到的技术包括Flex客户端的ActionScript编程、Java服务器的Socket编程、网络协议的理解以及可能的开发和调试工具的使用。这个主题对于构建实时交互的Web应用程序,尤其是在...

    Flex与Java Socket通信

    Flex与Java Socket通信是Web应用程序开发中的一个重要技术,它允许客户端和服务器之间进行实时、双向的数据交换。在本文中,我们将深入探讨如何实现Flex客户端与Java服务器之间的Socket通信。 首先,确保你拥有以下...

    基于flex4+java的聊天通信程序

    在这个系统中,Flex4作为客户端开发工具,提供了丰富的图形用户界面(GUI)和交互体验,而Java则在服务器端负责处理数据传输和业务逻辑。 1. **Flex4**:Flex4是Adobe开发的一套用于构建富互联网应用程序(RIA)的...

    flex的socket客户端连接java多线程socket服务端demo

    本示例探讨了如何使用Adobe Flex作为客户端,通过Socket接口与Java实现的多线程Socket服务端进行通信。以下是对这个主题的详细解释: 首先,Flex是一种开放源代码的富互联网应用程序(RIA)开发框架,它允许开发者...

    JSP+Flex+javaSocket+jquery+ajax聊天

    【JSP+Flex+JavaSocket+jQuery+Ajax聊天】是一个技术综合的应用实例,它整合了多种前端和后端技术,为用户提供类似QQ的聊天体验。下面将分别介绍这些技术及其在聊天应用中的作用。 **JSP(JavaServer Pages)**是...

    flex与java通信

    Flex与Java通信是Web开发中的一个重要领域,它允许前端用户界面(UI)通过富互联网应用程序(RIA)与后端服务器进行交互。Flex是Adobe开发的一种用于构建动态、交互性强的Web应用的开源框架,主要基于ActionScript...

    flex + asp.net web应用开发实战详解 code p2

    《Flex + ASP.NET Web应用开发实战详解 Code P2》是一本深入探讨如何使用Adobe Flex与Microsoft ASP.NET技术相结合,构建高效、交互性强的Web应用程序的书籍。本部分(P2)可能聚焦于实际代码实现和高级功能的应用。...

    Flex和java socket聊天源码

    Flex和Java Socket聊天源码是实现在线实时通信的一种技术结合,主要涉及的技术点包括Flex前端开发、Java后端Socket编程以及图文混排和表情支持。下面将详细解释这些知识点。 1. Flex:Flex是由Adobe公司开发的一套...

    网络游戏五子棋源码flex|+java

    网络游戏五子棋源码是开发在线游戏的一种实例,它结合了Flex技术和Java语言,为学习者提供了深入理解网络编程和游戏逻辑的宝贵资源。Flex是一种基于Adobe Flash平台的开源框架,用于构建富互联网应用程序(RIA),...

    flex socket开发总结

    本文将深入探讨Flex中Socket开发的关键知识点,包括如何连接到Java和C++的Server Socket,以及在实际应用中的注意事项。 1. Flex Socket API Flex SDK提供了一个名为`flash.net.Socket`的类,它允许我们创建客户端...

Global site tag (gtag.js) - Google Analytics