浏览 9175 次
锁定老帖子 主题:关于flex+java+socket的开发
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-11-19
以下是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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-11-19
达人来帮助 谢谢
|
|
返回顶楼 | |
发表时间:2010-11-19
没有人知道吗
|
|
返回顶楼 | |
发表时间:2010-11-19
有没有人啊 晕死
|
|
返回顶楼 | |
发表时间:2010-11-19
你说的 "客户端和服务端通讯了一次后" 一次完整应答吗?
accpet函数是client发起新建连接时, 才会触发, 但从你的mxml来看, 你是一次连接, 多次应答的长连接模式. |
|
返回顶楼 | |
发表时间:2010-11-19
smithfox 写道 你说的 "客户端和服务端通讯了一次后" 一次完整应答吗?
accpet函数是client发起新建连接时, 才会触发, 但从你的mxml来看, 你是一次连接, 多次应答的长连接模式. 楼上是正解,你的initapp只在程序初始化的时候执行握手,不过后面也不是长连接,明显,接收一次字符以后,就断掉了连接。 |
|
返回顶楼 | |
发表时间: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"; |
|
返回顶楼 | |
发表时间:2010-11-20
童鞋你的沙箱安全问题并未解决
|
|
返回顶楼 | |
发表时间:2010-11-20
换一个端口
如果采用这种策略文件的方式,不需要使用843端口,任何一个端口只要服务器将策略文件发给客户端,就可以解决安全沙盒问题。 |
|
返回顶楼 | |
发表时间:2010-11-22
貌似是你服务器端代码写的有问题:
while(true){ Socket s=serverSocket.accept(); DataOutputStream response=new DataOutputStream(s.getOutputStream()); response.write(content.getBytes()); response.flush(); s.shutdownOutput(); } 你试下这样 |
|
返回顶楼 | |