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

字號:

目的:做一個簡單的多玩家多線程的猜拳游戲。每個客戶機都與服務(wù)端的一個套接字進行通信,但是各個客戶機之間不進行通信。服務(wù)器受到客戶機的連接請求時會創(chuàng)建新的套接字并使其與客戶機連接。然后啟動線程與客戶機進行數(shù)據(jù)交換。套接字管理器是一個Vector,用于管理套接字的個數(shù)及其連接狀態(tài)。
    游戲描述:玩家通過向服務(wù)器發(fā)送0,1,2這個三個數(shù)字,用來代表剪刀,錘包,袱。服務(wù)器接到信息后會隨機產(chǎn)生0,1,2這三個數(shù)字的其中的一個。在客戶機上通過比較來進行判斷輸贏。
    服務(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)建隨機數(shù)的發(fā)生器
    public Server4(){}
    void startServer() //運行服務(wù)器
    {
    try
    {
    server=new ServerSocket(8888);
    System.out.println("服務(wù)器套接字已創(chuàng)建成功!");
    while(true)
    {
    Socket socket=server.accept();
    System.out.println("已經(jīng)與客戶機連接");
    new KBBCom_Thread(socket).start();
    sManager.add(socket);
    System.out.println("當(dāng)前客戶機連結(jié)數(shù):"+sManager.size());
    }
    }catch(Exception e){}
    }
    public static void main(String[] args) {
    Server4 server=new Server4();
    server.startServer();
    }
    class KBBCom_Thread extends Thread//與客戶機進行通信的線程累
    {
    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)
    {
    //向客戶機傳送0-2之間的整型隨機數(shù)
    writer.writeUTF(rnd.nextInt(3)+"n");
    writer.flush();
    System.out.println("來自客戶機:"+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("客戶機離開");
    System.out.println("當(dāng)前客戶機的連接數(shù):"+sManager.size());
    }catch(Exception e){}
    }
    }
    }
    }  知識點:套接字管理器(Vector)會將于客戶機連接的套接字添加到其列表中,在客戶機斷開連接后,在將相應(yīng)的套接自從列表中刪除,從中可以看出,客戶機連接數(shù)與列表中添加套接字?jǐn)?shù)目是一致的。
    Vector sManager=new Vector();
    sManager.add(socket); // 向列表添加套接字
    sManager.remove(socket); //從列表移除套接字
    sManager.size();//獲取客戶機連接數(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滾動到最下面
    }
    }
    ]]>
    

    
    
    
    
    

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