亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        Flex和java的socket通信(三)多客戶通信

        字號:

        目的:做一個(gè)簡單的多玩家多線程的猜拳游戲。每個(gè)客戶機(jī)都與服務(wù)端的一個(gè)套接字進(jìn)行通信,但是各個(gè)客戶機(jī)之間不進(jìn)行通信。服務(wù)器受到客戶機(jī)的連接請求時(shí)會創(chuàng)建新的套接字并使其與客戶機(jī)連接。然后啟動(dòng)線程與客戶機(jī)進(jìn)行數(shù)據(jù)交換。套接字管理器是一個(gè)Vector,用于管理套接字的個(gè)數(shù)及其連接狀態(tài)。
            游戲描述:玩家通過向服務(wù)器發(fā)送0,1,2這個(gè)三個(gè)數(shù)字,用來代表剪刀,錘包,袱。服務(wù)器接到信息后會隨機(jī)產(chǎn)生0,1,2這三個(gè)數(shù)字的其中的一個(gè)。在客戶機(jī)上通過比較來進(jìn)行判斷輸贏。
            服務(wù)端:
            客戶端:
            服務(wù)端代碼:Server4.java
            ====================
            import java.net.*;
            import java.io.*;
            import java.util.*;
            public class Server4 {
            private ServerSocket server;
            Vector sManager=new Vector();//管理套接字的Vector
            Random rnd=new Random();//創(chuàng)建隨機(jī)數(shù)的發(fā)生器
            public Server4(){}
            void startServer() //運(yùn)行服務(wù)器
            {
            try
            {
            server=new ServerSocket(8888);
            System.out.println("服務(wù)器套接字已創(chuàng)建成功!");
            while(true)
            {
            Socket socket=server.accept();
            System.out.println("已經(jīng)與客戶機(jī)連接");
            new KBBCom_Thread(socket).start();
            sManager.add(socket);
            System.out.println("當(dāng)前客戶機(jī)連結(jié)數(shù):"+sManager.size());
            }
            }catch(Exception e){}
            }
            public static void main(String[] args) {
            Server4 server=new Server4();
            server.startServer();
            }
            class KBBCom_Thread extends Thread//與客戶機(jī)進(jìn)行通信的線程累
            {
            Socket socket; //套接字引用變量
            private DataInputStream reader; //套接字輸入流
            private DataOutputStream writer;  //套接字輸出流
            KBBCom_Thread(Socket socket) //構(gòu)造函數(shù)
            {
            this.socket=socket;
            }
            public void run()
            {
            try
            {
            //獲取套接字的輸入輸出流
            reader=new DataInputStream(socket.getInputStream());
            writer=new DataOutputStream(socket.getOutputStream());
            String msg;
            //如果收到客戶端發(fā)來的數(shù)據(jù)
            while((msg=reader.readUTF())!=null)
            {
            //向客戶機(jī)傳送0-2之間的整型隨機(jī)數(shù)
            writer.writeUTF(rnd.nextInt(3)+"n");
            writer.flush();
            System.out.println("來自客戶機(jī):"+msg);
            }
            }catch(Exception e){}finally
            {
            try
            {
            sManager.remove(socket);  //刪除套接字
            //關(guān)閉輸入輸出流及套接字
            if(reader!=null)reader.close();
            if(writer!=null)writer.close();
            if(socket!=null)socket.close();
            reader=null;
            writer=null;
            socket=null;
            //向屏幕輸出相關(guān)信息
            System.out.println("客戶機(jī)離開");
            System.out.println("當(dāng)前客戶機(jī)的連接數(shù):"+sManager.size());
            }catch(Exception e){}
            }
            }
            }
            }  知識點(diǎn):套接字管理器(Vector)會將于客戶機(jī)連接的套接字添加到其列表中,在客戶機(jī)斷開連接后,在將相應(yīng)的套接自從列表中刪除,從中可以看出,客戶機(jī)連接數(shù)與列表中添加套接字?jǐn)?shù)目是一致的。
            Vector sManager=new Vector();
            sManager.add(socket); // 向列表添加套接字
            sManager.remove(socket); //從列表移除套接字
            sManager.size();//獲取客戶機(jī)連接數(shù)
            客戶端代碼:Client4.mxml
            ==================================================================================
            
            
            
                import flash.net.Socket;
            import flash.utils.ByteArray;
            import flash.events.ProgressEvent;
            private var socket:Socket=new Socket();
            private var intClient:int;//定義客戶端數(shù)字出拳
            private var intServer:int; //定義服務(wù)端數(shù)字出拳
            private var intSY:int; //定義輸贏判斷
            private var strClient:String; //客戶端文字出拳
            private var strServer:String; //服務(wù)端的文字出拳
            internal function initApp():void
            {
            socket.connect("127.0.0.1",8888);
            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+="連接已關(guān)閉 n";
            }
            internal function sendMessage(msg:String):void
            {
            var message:ByteArray=new ByteArray();
            message.writeUTF(msg); //發(fā)送出拳數(shù)字
            socket.writeBytes(message);
            socket.flush();
            intClient=int(msg);
            switch(intClient)  //將數(shù)字轉(zhuǎn)換成文字用于發(fā)布到屏幕上
            {
            case 0:
            strClient="剪刀";
            break;
            case 1:
            strClient="錘";
            break;
            case 2:
            strClient="包袱";
            break;
            }
            myText.text+="你出:"+strClient+"; ";
            myInput.text="";
            }
            internal function funSocket(event:ProgressEvent):void//接到服務(wù)器信息
            {
            var msg:String="";
            while(socket.bytesAvailable)
            {
            msg=socket.readUTF();
            intServer=int(msg);
            intSY=intClient-intServer;//通過數(shù)值判斷輸贏
            switch(intServer)  //將數(shù)字轉(zhuǎn)換成文字用于發(fā)布到屏幕上
            {
            case 0:
            strServer="剪刀";
            break;
            case 1:
            strServer="錘";
            break;
            case 2:
            strServer="包袱";
            break;
            }
            myText.text+="服務(wù)器出:"+strServer+"; ";
            //判斷輸贏的算法
            if(intSY>0&&intSY<2)
            {
            myText.text+=" 結(jié)果:你贏了 n";
            }else if(intClient==intServer)
            {
            myText.text+=" 結(jié)果:平手 n";
            }else if(intSY<0&&intSY>-2)
            {
            myText.text+=" 結(jié)果:你輸了 n";
            }else if(intSY>=2)
            {
            myText.text+=" 結(jié)果:你輸了 n";
            }else if(intSY<=-2)
            {
            myText.text+=" 結(jié)果:你贏了 n";
            }
            myText.verticalScrollPosition = myText.maxVerticalScrollPosition;// myText滾動(dòng)到最下面
            }
            }
            ]]>
            

            
            
            
            
            

            這是我的學(xué)習(xí)筆記,簡單的記敘了flex+java如何進(jìn)行socket通信。希望對有需要的人有所幫助