<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    方槍槍的java世界

    不要因為風雨飄落就停止了你的腳步,真正的得失就在你的心中。 做喜歡做的事,不輕言放棄!

    ChatClient

    package com.tianhe.frm.chat;

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    import java.util.Scanner;

    /**
     *
     *<br>
     * 客戶端的實現效果 <br>
     *<br>
     * 1.登錄服務器,如果服務器端口號和IP號輸入的字符都是"0"則,客戶端連接到默認的服務器 <br>
     *<br>
     * 2.輸入聊天昵稱 <br>
     *<br>
     * 3.輸入"-quit"會自動退出聊天 <br>
     *<br>
     * 4.輸入"-getList"會得到在線用戶的名稱 <br>
     *<br>
     * 5.輸入"-to <用戶名稱> <聊天信息>"會把信息發送到指定的用戶處,他人看不到 <br>
     *<br>
     * 6.輸入"-help"會得到客戶端相應操作幫助 <br>
     *<br>
     * 6.直接輸入內容則會將內容發送到所有在線的用戶處 <br>
     *<br>
     *<br>
     *<br>
     *<br>
     * 客戶端的類與方法 <br>
     *<br>
     * 1.建立連接方法:connectServer(String ip,int serverPort) <br>
     *<br>
     * 2.斷開連接方法:disconnectServer() <br>
     *<br>
     * 2.發送消息方法:sendMes(String mes) <br>
     *<br>
     * 3.接受消息方法:getMes() <br>
     *<br>
     * 4.接受一次消息:getMesOnce() <br>
     *<br>
     * 5.獲得用戶列表:getList(String mes) <br>
     *<br>
     * 6.測試連接方法:testConnect(String ip,int serverPort) <br>
     *<br>
     * 7.檢查用戶名 :checkNickName(String nickName) <br>
     *<br>
     * 8.獲得幫助列表:helpList(); <br>
     *<br>
     * 9.各項內容的輸入在main方法中進行 <br>
     *<br>
     *<br>
     *<br>
     *<br>
     * 重點注意的地方 <br>
     *<br>
     * 由于客戶端無法知道服務器何時轉發數據,所以客戶端需要一直不停地監聽消息,為了不影響其他的方法,如發送數據,這里用到多線程,即為接受數據單獨建立一個線程,以防止影響其他方法的正常工作。
     *
     */
    public class ChatClient implements Runnable
    {
        private String serverIp = "localhost";
       
        private int serverPort = 9999;
       
        private InetAddress serverAddr = null;
       
        // 客戶端
        private DatagramSocket ds = null;
       
        // 發送的數據報
        private DatagramPacket dp = null;
       
        // 用來測試是否能夠連接成功或者用戶名是否正確
        // 在testConnect和checkNickName中會用到.
        // 并穿插在sendMes方法中
        private boolean test = true;
       
        /**
         * 建立連接
         *
         * @param ip 服務器IP號
         * @param serverPort 服務器Port
         */
        public boolean initServer(InetAddress serverAddr, int serverPort)
        {
            this.serverAddr = serverAddr;
            this.serverPort = serverPort;
           
            try
            {
                ds = new DatagramSocket();
            }
            catch (SocketException s)
            {
                System.out.println("The Connection of server is error.");
                return false;
            }
           
            return true;
        }
       
        /**
         * 斷開連接
         */
        public void disconnectServer()
        {
            // 當客戶端斷開連接之前,客戶端會向服務器端發送一個信息,
            // 以便告訴服務器該客戶下線
            this.sendMes("-quit");
            if (ds != null)
                ds.close();
           
        }
       
        /**
         * 發送消息
         *
         * @param mes
         */
        public void sendMes(String mes)
        {
            byte[] buf = mes.getBytes();
            dp = new DatagramPacket(buf, buf.length, serverAddr, serverPort);
            // 當建立發送時,測試正常
            test = true;
            try
            {
                ds.send(dp);
            }
            catch (NullPointerException n)
            {
                // 如果無法得到要發送的消息,測試終止
                test = false;
                System.out.println("The nullity of the address of connection");
            }
            catch (IOException s)
            {
                // 如果無法發送消息至服務器,測試終止
                test = false;
                System.out.println("There is a problem to send message.");
            }
            finally
            {
            }
        }
       
        /**
         * 得到數據
         */
        public void getMes()
        {
            byte[] buf = new byte[1024];
            DatagramPacket getDatas = new DatagramPacket(buf, buf.length);
            String mes = null;
            try
            {
                while (true)
                {
                    ds.receive(getDatas);
                    mes = new String(buf, 0, getDatas.getLength());
                    // 如果服務器發送的消息中的頭片段有-getList
                    // 表明客戶端獲得在線用戶列表,調用getList方法解析
                    if (mes.indexOf("-getList") == 0)
                        this.getList(mes);
                    else
                        System.out.println(mes);
                }
            }
            catch (IOException i)
            {
                System.out.println("Fail in receving message");
            }
        }
       
        /**
         * 得到一次數據
         *
         */
        public String getMesOnce()
        {
            byte[] buf = new byte[1024];
            DatagramPacket getDatas = new DatagramPacket(buf, buf.length);
            String mes = null;
            try
            {
                ds.receive(getDatas);
                mes = new String(buf, 0, getDatas.getLength());
            }
            catch (Exception e)
            {
                System.out.println("!-Can not receive the message!");
            }
            finally
            {
            }
            return mes;
        }
       
        /**
         * 顯示在線用戶列表
         *
         * @param mes
         */
        private void getList(String mes)
        {
            String[] list = mes.split(",");
            System.out.println("在線用戶:\n-------------");
            for (int i = 1; i < list.length; i++)
            {
                System.out.println("    * " + list[i]);
            }
            System.out.println("-------------");
        }
       
        /**
         * 判斷用戶名輸入是否正確
         */
        private boolean checkNickName(String nickName)
        {
            test = true;
            String mes = null;
            // 判斷昵稱是否符合約定
            for (int i = 0; i < nickName.length(); i++)
            {
                char temp = nickName.charAt(i);
                // 如果不符合,則終止測試
                if (!Character.isLetterOrDigit(temp))
                {
                    test = false;
                    break;
                }
            }
            // 如果通過約定,則試圖向服務器發送昵稱,進行判斷
            if (test)
            {
                this.sendMes("-nick " + nickName);
                mes = this.getMesOnce();
                // 如果服務器返回"-nick"標識
                // 說明測試昵稱失敗,終止測試
                if (mes.startsWith("-nick"))
                {
                    test = false;
                }
            }
           
            System.out.println(mes);
            return test;
        }
       
        /**
         * 得到幫助列表
         *
         */
        public void helpList()
        {
            System.out.println("重要說明:如果已經成功連接,只要輸入內容,所有在線用戶都能看到您的發言。" + "\n" + "-help" + "         獲取客戶端相應操作的幫助" + "\n"
                    + "-test" + "         測試與服務器的連接,如果已經服務器連接,請不要選用此項" + "\n" + "-getList" + "    得到在線用戶的列表" + "\n"
                    + "-to <name> <message>" + "\n" + "                    將消息發送到特定的在線用戶處" + "\n" + "-quit"
                    + "         斷開連接,退出聊天室" + "\n");
        }
       
        /**
         * 線程部分
         */
        public void run()
        {
            getMes();
        }
       
        /**
         * 各項內容的操作器
         */
        public static void main(String[] args)
        {
            ChatClient cc = new ChatClient();
           
            // serverAddr && serverPort
            String serverIp = "localhost";
            int serverPort = 9999;
            InetAddress serverAddr = null;
           
            if (args != null && args.length > 0)
            {
                int i = 0;
                while (i < args.length)
                {
                    // serverAddr
                    if (args[i].equalsIgnoreCase("-ServerAddr"))
                    {
                        i = i + 1;
                        serverIp = args[i];
                        continue;
                    }
                   
                    // serverPort
                    int ti = 9999;
                    if (args[i].equalsIgnoreCase("-ServerPort"))
                    {
                        i = i + 1;
                        ti = Integer.parseInt(args[i]);
                        if (ti > 0)
                        {
                            serverPort = ti;
                        }
                        i = i + 1;
                        continue;
                    }
                }
            }
           
            try
            {
                serverAddr = InetAddress.getByName(serverIp);
            }
            catch (UnknownHostException e)
            {
                e.printStackTrace();
                System.exit(-1);
            }
           
            System.out.println("歡迎登錄Lexiaofei聊天室!");
            Scanner input = new Scanner(System.in);
           
            // 連接服務器
            cc.initServer(serverAddr, serverPort);
           
            // 輸入昵稱
            boolean goon = true;
            while (goon)
            {
                // 第三步:輸入昵稱
                System.out.println("3.請輸入您登錄后顯示的昵稱(只能輸入中文、英文字母及數字):");
                String nick = input.next();
                boolean judge = cc.checkNickName(nick);
                // 判斷昵稱是否輸入正確
                if (judge)
                    goon = false;
                else
                    System.out.println("!-您輸入的用戶名不符合條件,請重新輸入!");
            }
           
            // 開始運行接收數據
            new Thread(cc).start();
            // 聊天
            String mes = null;
            System.out.println("!-您成功進入聊天室!");
           
            while (!(mes = input.nextLine()).equalsIgnoreCase("-quit"))
            {
                // 如果輸入"-test"命令,開始測試
                if (mes.trim().equalsIgnoreCase("-getList"))
                {
                    cc.sendMes(mes);
                    // -nick 設置昵稱
                }
                else if (mes.equalsIgnoreCase("-help"))
                {
                    cc.helpList();
                    // 如果輸入的是空字符,則不發送
                }
                else
                {
                    if (!mes.equals(""))
                    {
                        cc.sendMes(mes);
                    }
                }
            }
           
            // 退出
            input.close();
            cc.disconnectServer();
           
        }
       
        /**
         * 錯誤提示標記
         *
         * @param str
         */
        public static void errorTip(String str)
        {
            System.out.println("-----------------\n" + str + "\n-----------------");
        }
    }

    posted on 2013-12-16 21:13 做強大的自己 閱讀(207) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费看国产一级片| 免费黄色福利视频| 亚洲国产香蕉人人爽成AV片久久| 国产成人亚洲综合网站不卡| 3d动漫精品啪啪一区二区免费 | 国产黄色片在线免费观看| 亚洲中文字幕乱码熟女在线| 又黄又爽又成人免费视频| 亚洲人6666成人观看| 免费在线看v网址| 亚洲综合一区二区三区四区五区| 在线免费视频一区二区| 久久精品国产亚洲av天美18| 国产一区二区视频免费| EEUSS影院WWW在线观看免费| 亚洲精品午夜无码电影网| 全免费a级毛片免费看不卡| 亚洲人片在线观看天堂无码| 国产精品免费一级在线观看| 一级特黄a免费大片| 亚洲va中文字幕无码久久不卡| 久久国产高潮流白浆免费观看| 自拍偷区亚洲国内自拍| 国产最新凸凹视频免费| 免费无码av片在线观看| 国产精品亚洲精品青青青| 亚洲 综合 国产 欧洲 丝袜| 免费av一区二区三区| 97人妻无码一区二区精品免费| 亚洲日韩亚洲另类激情文学| 亚洲婷婷国产精品电影人久久| 可以免费观看的国产视频| 亚洲熟妇无码AV不卡在线播放| 亚洲无码精品浪潮| 亚洲成人免费在线观看| 免费无码午夜福利片 | 亚洲人成色777777老人头| 在线亚洲97se亚洲综合在线| 69av免费视频| 黄 色一级 成 人网站免费| 亚洲乱码一二三四区麻豆|