flex socket 与Java 交互,堵塞,不发送数据的问题
flex socket 与Java 交互,第一次交互已经完成了,客户端请求策略文件,服务器发送策略文件给客户端,解决了沙箱安全的问题;然后在客户端手动触发,向服务器端发数据,服务器端老是接收不到,像是一直被放在队列中,当客户端的页面关闭时,才会把所有的数据提交;服务器端才能接收到;这显然是有问题的;我希望是实时的交互
这里有几个问题没弄明白:
一、socket方式连接,服务器与客户端,始终使用一个scoket对象,还是每次请求处理完毕,关闭scoket对象??
二、socket通信过程中,堵塞是怎么回事?该如何处理?
下面发上代码,有耐心的朋友帮忙看下:
//服务器端代码package hz.game.server;import hz.console.UserManager;import hz.game.common.ActionNo;import hz.game.common.Pack;import hz.game.common.ReturnVo;import hz.game.server.entity.OnlineUser;import hz.game.server.service.LoginService;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;import net.sf.json.JSONObject;public class GmServer extends Thread { private boolean isAlive; private LoginService loginService; private BufferedReader reader; private BufferedWriter writer; private ServerSocket server;// 服务器套接字 private Socket socket; private static GmServer instance = null; // 缺省构造函数 private GmServer() { try { server = new ServerSocket(2024);// 创建服务器套接字,开始监听2024 this.isAlive = true; } catch (IOException e) { e.printStackTrace(); } } public static GmServer getInstance(){ if(instance == null){ System.out.println("初始化 GmServer ..."); instance = new GmServer(); } return instance; } // 启动服务器,开始监听 public void run() { try { while(isAlive){ System.out.println("启动GmServer,开始监听..."); socket = server.accept(); try{ reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")); String ip = socket.getInetAddress().getHostAddress(); String line = null; StringBuffer strbuf = new StringBuffer(); while((line = reader.readLine()) != null){ strbuf.append(line); } System.out.println(strbuf.toString()); JSONObject jsonObject = JSONObject.fromObject(strbuf.toString()); String actionNo = (String)jsonObject.get("actionNo"); String data = (String)jsonObject.get("data"); System.out.println("actionNo:"+actionNo+", data:"+data);// JSONObject packObject = JSONObject.fromObject(data);// Pack pack = (Pack)JSONObject.toBean(packObject, Pack.class); if(ActionNo.C000.equals(actionNo)){ //登录验证请求 JSONObject dataJobj = JSONObject.fromObject(data); String userId = dataJobj.getString("userId"); String password = dataJobj.getString("password"); ReturnVo rv = loginService.loginCheck(userId, password, ip); if("1".equals(rv.getFlag())){ //登录成功 JSONObject sendJobj = JSONObject.fromObject(new Pack(ActionNo.S000, rv)); writer.write(sendJobj.toString()); writer.flush(); OnlineUser user = new OnlineUser(userId, socket); user.start(); UserManager.getInstance().addUser(user); }else{ //登录失败,发消息回客户端 JSONObject sendJobj = JSONObject.fromObject(new Pack(ActionNo.S000, rv)); writer.write(sendJobj.toString()); writer.flush(); } } }catch(Exception e){ JSONObject sendJobj = JSONObject.fromObject(new Pack(ActionNo.S000, new ReturnVo("0","后台异常!"))); writer.write(sendJobj.toString()); writer.flush(); e.printStackTrace(); }finally{ if(reader != null){ reader.close(); } if(writer != null){ writer.close(); } if(socket != null){ socket.close(); socket = null; } } } } catch (Exception e) { e.printStackTrace(); } finally { } } public void sendMessage(Socket socket, String jsonmsg){ try { writer.write(jsonmsg+"\0"); writer.flush(); } catch (IOException e) { e.printStackTrace(); } } public void close(){ try { if (server != null){ server.close();// 关闭服务器套接字。 } this.isAlive = false; System.out.println("服务器关闭!"); } catch (IOException ie) { ie.printStackTrace(); } } public void setLoginService(LoginService loginService) { this.loginService = loginService; }}
//客户端代码<?xml version="1.0" encoding="utf-8"?><mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="350" height="200" title="用户登录" creationComplete="init(event)"><mx:Script> <![CDATA[ import common.Pack; import mx.core.Application; import mx.controls.Alert; import mx.managers.PopUpManager; import org.phprpc.PHPRPC_Error; import org.phprpc.PHPRPC_Client; import com.adobe.serialization.json.JSON; public function closeWin(event:MouseEvent = null):void{ PopUpManager.removePopUp(this); } //--------------socket方式登录--------------------------- import flash.net.Socket; import mx.controls.Alert; import flash.utils.ByteArray; private var socket:Socket = new Socket("127.0.0.1",2024);//定义Socket private function init(event:Event = null):void{ Security.loadPolicyFile("xmlsocket://127.0.0.1:2024"); socket.addEventListener(Event.CONNECT,funConnect); //监听是否连接 socket.addEventListener(Event.CLOSE,funClose); //监听连接关闭 socket.addEventListener(ProgressEvent.SOCKET_DATA,receive); //监听输入流 socket.connect("127.0.0.1",2024); //连接服务器 // socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);// socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); trace("尝试连接服务器。。。"); } private function receive(event:ProgressEvent):void { // var receiveMsg:String = socket.readUTF(); var receiveMsg:String = ""; Alert.show("接收数据:"+receiveMsg); var rvPack:Pack = JSON.decode(receiveMsg); if(rvPack.getActionNo() == "S0000"){ var dataObj:Object = rvPack.getData(); if(dataObj.flag == "1"){ Alert.show("登录成功!"); }else{ Alert.show("登录失败!"+dataObj.data); } } } private function funConnect(event:Event):void{ Alert.show("连接已建立!"); } private function funClose(event:Event):void{ Alert.show("连接已关闭!"); } //发送数据对应按钮click事件 private function sendMessage(event:MouseEvent = null):void{// socket.connect("127.0.0.1",2024); var sendObj:Object = new Object(); sendObj.userId = userId.text; sendObj.password = password.text; var sendData:String = JSON.encode(sendObj); Alert.show("sendData:"+sendData); var packObj:Object = new Object(); packObj.actionNo = "C000"; packObj.data = sendData; var packStr:String = JSON.encode(packObj); Alert.show("发送内容:"+packStr); var message:ByteArray=new ByteArray();//新建一个ByteArray存放数据 message.writeUTFBytes(packStr);//写入数据,writeUTFBytes方法,以utf-8格式传数据避免中文乱码 socket.writeBytes(message); //写入Socket的缓冲区 socket.flush();//调用flush方法发送信息// socket.close(); } ]]></mx:Script> <mx:HBox width="100%"> <mx:Label text="用户名:" width="100"/> <mx:TextInput id="userId" width="200"/> </mx:HBox> <mx:HBox width="100%"> <mx:Label text="密码:" width="100"/> <mx:TextInput id="password" width="200" displayAsPassword="true"/> </mx:HBox> <mx:HBox width="100%" horizontalAlign="center" height="89" verticalAlign="middle"> <mx:Button label="登录" click="sendMessage(event)"/> </mx:HBox></mx:TitleWindow>