package test 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.ProgressEvent;
    import flash.net.Socket;
    import flash.text.TextField;
    /**
     * ...
     * @author lizhi http://game-develop.net/
     
*/
    public class TestMina extends Sprite
    {
        private var socket:Socket;
        private var msglen:int = -1;
        private var tf:TextField;
        public function TestMina() 
        {
            tf = new TextField;
            addChild(tf);
            tf.autoSize = "left";
            socket = new Socket("127.0.0.1", 9123);
            socket.addEventListener(Event.CONNECT, socket_connect);
            socket.addEventListener(ProgressEvent.SOCKET_DATA, socket_socketData);
        }
        
        private function socket_socketData(e:ProgressEvent):void 
        {
            read();
        }
        
        private function read():void {
            if (msglen<0) {
                //log("读长度");
                if (socket.bytesAvailable>=2) {
                    msglen = socket.readShort();
                    read();
                }
            }else if (socket.bytesAvailable >= (msglen-2)) {
                //log("读消息体");
                var id:int = socket.readInt();
                //log("消息id id:" + id);
                switch(id){
                case 1://其它玩家进入
                    var userId:int = socket.readInt();
                    log(userId,"进入");
                    break;
                case 2://告诉玩家id并返回其它用户信息
                    userId = socket.readInt();
                    log("进入成功 你的id是:", userId);
                    var len:int = socket.readInt();
                    var arr:Array = [];
                    while (len-->0) {
                        userId = socket.readInt();
                        arr.push(userId);
                    }
                    if (arr.length > 0) {
                        log("其它用户:",arr);
                    }
                    break;
                case 3://有用户退出
                    userId = socket.readInt();
                    log(userId,"退出");
                    break;
                case 4://用户发言
                    userId = socket.readInt();
                    var str:int = socket.readInt();
                    log(userId+"说:",str);
                    break;
                }
                msglen = -1;
            }
        }
        
        private function log(...args):void {
            tf.appendText(args + "\n");
        }
        
        private function socket_connect(e:Event):void 
        {
            stage.addEventListener(MouseEvent.CLICK, stage_click);
        }
        
        private function stage_click(e:MouseEvent):void 
        {
            var v:int = Math.random() * 10;
            log("发送", v);
            socket.writeShort(10);
            socket.writeInt(5);
            socket.writeInt(v);
            socket.flush();
        }
        
    }

}


import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;


public class Message {
    public IoSession session;
    public IoBuffer buff;
    public int msglen=-1;
    
}


import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;


public class TestOne extends IoHandlerAdapter{
    HashMap<IoSession, Message> map=new HashMap<IoSession, Message>();
    @Override
    public void messageReceived(IoSession session,Object message) throws Exception{
        IoBuffer buff = (IoBuffer)message;
        Message msg=map.get(session);
        int p = msg.buff.position();
        msg.buff.put(buff);
        msg.buff.position(p);
        read(msg);
    }
    
    public void read(Message msg){
        int limit=msg.buff.limit()-msg.buff.position();
        if(msg.msglen<0){
            if(limit>=2){
                msg.msglen=msg.buff.getShort();
                System.out.println("消息长度"+msg.msglen);
                read(msg);
            }
        }else if(limit>=(msg.msglen-2)){
            int id = msg.buff.getInt();
            System.out.println("解析消息"+id);
            switch(id){
            case 5:
                int str = msg.buff.getInt();
                Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator(); 
                while (iter.hasNext()) { 
                    Entry<IoSession, Message> entry = iter.next(); 
                    Message val = (Message)entry.getValue();
                    System.out.println("发送到"+val.session.getId());
                    
                    IoBuffer buff = IoBuffer.allocate(0);
                    buff.setAutoExpand(true);
                    buff.putShort((short)14);
                    buff.putInt(4);
                    buff.putInt((int)msg.session.getId());
                    buff.putInt(str);
                    buff.flip();
                    val.session.write(buff);
                }
                break;
            case 2:
                break;
            case 3:
                break;
            }
            msg.msglen=-1;
        }
    }
    
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        System.out.println("Session created...:"+session.getId());
        //1:通知其它用户有人进入  2:告诉玩家的id并返回给所有用户信息
        IoBuffer buff2 = IoBuffer.allocate(0);
        buff2.setAutoExpand(true);//length,id=2,userid,arrlength,id
        buff2.putShort((short)(10+4*map.size()));
        buff2.putInt(2);
        buff2.putInt((int)session.getId());
        buff2.putInt(map.size());
        Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator(); 
        while (iter.hasNext()) { 
            Entry<IoSession, Message> entry = iter.next(); 
            Message val = (Message)entry.getValue();
            System.out.println("发送到"+val.session.getId());

            buff2.putInt((int)val.session.getId());
            
            IoBuffer buff = IoBuffer.allocate(0);
            buff.setAutoExpand(true);
            buff.putShort((short)10);
            buff.putInt(1);
            buff.putInt((int)session.getId());
            buff.flip();
            val.session.write(buff);
        }
        
        buff2.flip();
        session.write(buff2);
        
        Message msg = new Message();
        msg.session=session;
        msg.buff=IoBuffer.allocate(0);
        msg.buff.setAutoExpand(true);
        map.put(session, msg);
        
    }
    
    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("Session closed...:"+session.getId());
        map.remove(session);
        //3: 通知其它用户有人移出
        Iterator<Entry<IoSession, Message>> iter = map.entrySet().iterator(); 
        while (iter.hasNext()) { 
            @SuppressWarnings("rawtypes")
            Map.Entry entry = iter.next(); 
            Message val = (Message)entry.getValue();
            IoBuffer buff = IoBuffer.allocate(0);
            buff.setAutoExpand(true);
            buff.putShort((short)10);
            buff.putInt(3);
            buff.putInt((int)session.getId());
            buff.flip();
            val.session.write(buff);
        }
    }
    /**
     * @param args
     
*/
    public static void main(String[] args) throws IOException{
        IoAcceptor acceptor = new NioSocketAcceptor();
        //acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        //acceptor.getFilterChain().addLast(
        //            "codec",
        //            new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))
        //        );
        acceptor.setHandler(new TestOne());
        acceptor.getSessionConfig().setReadBufferSize(2048);
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
        acceptor.bind(new InetSocketAddress(9123));
    }
    
    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        session.close(true);
    }

}
posted on 2012-11-27 19:38  sliz  阅读(335)  评论(0)    收藏  举报