首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

flex socket 与Java 交互,堵塞,不发送数据的有关问题

2012-03-12 
flex socket 与Java 交互,堵塞,不发送数据的问题flex socket 与Java 交互,第一次交互已经完成了,客户端请

flex socket 与Java 交互,堵塞,不发送数据的问题
flex socket 与Java 交互,第一次交互已经完成了,客户端请求策略文件,服务器发送策略文件给客户端,解决了沙箱安全的问题;然后在客户端手动触发,向服务器端发数据,服务器端老是接收不到,像是一直被放在队列中,当客户端的页面关闭时,才会把所有的数据提交;服务器端才能接收到;这显然是有问题的;我希望是实时的交互

这里有几个问题没弄明白:
一、socket方式连接,服务器与客户端,始终使用一个scoket对象,还是每次请求处理完毕,关闭scoket对象??
二、socket通信过程中,堵塞是怎么回事?该如何处理?


下面发上代码,有耐心的朋友帮忙看下:

Java code
//服务器端代码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;    }} 




Java code
//客户端代码<?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> 



[解决办法]
不知道帮顶
[解决办法]
一个Socket由一个IP,一个端口号唯一确定!
Socket堵塞类似于死锁的概念,就是在没有资源的时候不会马上返回,直到有资源为止

[解决办法]
低手路过

热点排行