亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chessserver.java

?? 實現了一個網絡五子棋的對弈程序
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
package server;

import java.io.*;
import java.net.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;

/**
 * 顯示服務器及用戶信息的Panel類
 */
class MessageServerPanel extends Panel {
    // 主消息窗口
    TextArea messageBoard = new TextArea("", 22, 50, TextArea.SCROLLBARS_VERTICAL_ONLY);

    Label statusLabel = new Label("當前連接數:", Label.LEFT);

    Panel boardPanel = new Panel();// 主顯示區Panel

    Panel statusPanel = new Panel();// 連接狀態Panel

    MessageServerPanel() {
        setSize(350, 300);
        setBackground(new Color(204, 204, 204));
        setLayout(new BorderLayout());
        boardPanel.setLayout(new FlowLayout());
        boardPanel.setSize(210, 210);
        statusPanel.setLayout(new BorderLayout());
        statusPanel.setSize(210, 50);
        boardPanel.add(messageBoard);
        statusPanel.add(statusLabel, BorderLayout.WEST);
        add(boardPanel, BorderLayout.CENTER);
        add(statusPanel, BorderLayout.NORTH);
    }
}

/**
 * 服務器線程,主要用于服務器與客戶端的通信
 */
class ServerThread extends Thread {
    Socket clientSocket;

    Hashtable clientDataHash;// Socket與發送數據的流的映射

    Hashtable clientNameHash;// Socket與用戶名的映射

    Hashtable chessPeerHash;// 對弈的兩個客戶端用戶名的映射

    MessageServerPanel server;

    boolean isClientClosed = false;

    /**
     * 服務器端線程的構造函數,用于初始化一些對象。
     */
    ServerThread(Socket clientSocket, Hashtable clientDataHash, Hashtable clientNameHash, Hashtable chessPeerHash,
            MessageServerPanel server) {
        this.clientSocket = clientSocket;
        this.clientDataHash = clientDataHash;
        this.clientNameHash = clientNameHash;
        this.chessPeerHash = chessPeerHash;
        this.server = server;
    }

    /**
     * 對客戶端發來的消息處理的函數,處理后轉發回客戶端。處理消息的過程比較復雜, 要針對很多種情況分別處理。
     */
    public void messageTransfer(String message) {
        String clientName, peerName;
        /////////////命令處理///////////////////////////////
        // 如果消息以“/”開頭,表明是命令消息。
        if (message.startsWith("/")) {

            // 如果消息以“/list”開頭,則將其回饋到客戶端以更新用戶列表
            if (message.equals("/list")) {
                Feedback(getUserList());
            }
            // 如果消息以"/creatgame [inchess]"開頭,則修改clientNameHash映射
            // 和chessPeerHash映射。
            else if (message.startsWith("/creatgame [inchess]")) {
                //
                String chessServerName = message.substring(20);
                synchronized (clientNameHash) {
                    clientNameHash.put(clientSocket, message.substring(11));
                }
                synchronized (chessPeerHash) {//剛創建,等待其他人加入
                    chessPeerHash.put(chessServerName, "wait");
                }
                Feedback("/yourname " + clientNameHash.get(clientSocket));
                chessPeerTalk(chessServerName, "/OK");
                publicTalk(getUserList());
            }
            // 如果消息以“/joingame”開頭,則將消息的服務端名字和本地用戶名提取出來,
            // 然后修改clientNameHash表和chessPeerHash表。
            if (message.startsWith("/joingame ")) {
                StringTokenizer userToken = new StringTokenizer(message, " ");
                String getUserToken, serverName, selfName;
                String[] chessNameOpt = {"0", "0"};
                int getOptNum = 0;
                // 提取服務端用戶名和本地用戶名
                while (userToken.hasMoreTokens()) {
                    getUserToken = (String) userToken.nextToken(" ");
                    if (getOptNum >= 1 && getOptNum <= 2) {
                        chessNameOpt[getOptNum - 1] = getUserToken;
                    }
                    getOptNum++;
                }
                serverName = chessNameOpt[0];
                selfName = chessNameOpt[1];
                // 如果有服務端在等待開始棋局
                if (chessPeerHash.containsKey(serverName) && chessPeerHash.get(serverName).equals("wait")) {
                    // 修改Socket和名字映射
                    synchronized (clientNameHash) {
                        clientNameHash.put(clientSocket, ("[inchess]" + selfName));
                    }
                    // 修改chessPeerHash映射
                    synchronized (chessPeerHash) {
                        chessPeerHash.put(serverName, selfName);
                    }
                    publicTalk(getUserList());
                    chessPeerTalk(selfName, ("/peer " + "[inchess]" + serverName));
                    chessPeerTalk(serverName, ("/peer " + "[inchess]" + selfName));
                } else {
                    chessPeerTalk(selfName, "/reject");
                    try {
                        clientClose();
                    } catch (Exception ez) {
                    }
                }
            }
            // 如果消息以“/[inchess]”開頭,則獲取要發送消息的用戶名和發送的消息
            // 然后發送出去。
            else if (message.startsWith("/[inchess]")) {
                int firstLocation = 0, lastLocation;

                lastLocation = message.indexOf(" ", 0);

                peerName = message.substring((firstLocation + 1), lastLocation);
                message = message.substring((lastLocation + 1));
                if (chessPeerTalk(peerName, message)) {
                    Feedback("/error");
                }
            }
            // 如果消息以“/giveup”開頭,則判斷是對弈雙方哪方放棄了。
            else if (message.startsWith("/giveup ")) {
                String chessClientName = message.substring(8);
                if (chessPeerHash.containsKey(chessClientName)
                        && !((String) chessPeerHash.get(chessClientName)).equals("wait")) {
                    // 如果服務方放棄,則發送消息“/youwin”表明對方獲勝
                    chessPeerTalk((String) chessPeerHash.get(chessClientName), "/youwin");
                    //剔除這對對弈的人。。
                    synchronized (chessPeerHash) {
                        chessPeerHash.remove(chessClientName);
                    }
                }
                if (chessPeerHash.containsValue(chessClientName)) {
                    // 如果客戶方放棄,也發送消息“/youwin”表明對方獲勝
                    chessPeerTalk((String) getHashKey(chessPeerHash, chessClientName), "/youwin");
                    synchronized (chessPeerHash) {
                        chessPeerHash.remove((String) getHashKey(chessPeerHash, chessClientName));
                    }
                }
            }
            // 如果找不到發送消息的用戶,則輸出消息說“沒有這個用戶”
            else {
                int firstLocation = 0, lastLocation;
                lastLocation = message.indexOf(" ", 0);
                if (lastLocation == -1) {
                    Feedback("無效命令");
                    return;
                } else {
                    peerName = message.substring((firstLocation + 1), lastLocation);
                    message = message.substring((lastLocation + 1));
                    message = (String) clientNameHash.get(clientSocket) + ">" + message;
                    if (peerTalk(peerName, message)) {
                        Feedback("沒有這個用戶:" + peerName + "\n");
                    }
                }

            }

        }
        // //////////////////////////////////////////////
        // 如果不以“/”開頭,表明是普通消息,直接發送
        else {
            message = clientNameHash.get(clientSocket) + ">" + message;
            server.messageBoard.append(message + "\n");
            publicTalk(message);
            server.messageBoard.setCaretPosition(server.messageBoard.getText().length());
        }

    }

    /**
     * 發送公共消息的函數,將消息向每個客戶端都發送一份
     */
    public void publicTalk(String publicTalkMessage) {

        synchronized (clientDataHash) {
            //枚舉遍歷所有客戶端輸出流。。
            for (Enumeration enu = clientDataHash.elements(); enu.hasMoreElements();) {
                DataOutputStream outData = (DataOutputStream) enu.nextElement();
                try {
                    //輸出信息。。這里會阻塞
                    outData.writeUTF(publicTalkMessage);
                } catch (IOException es) {
                    //打印異常堆棧。。。終止程序。。
                    es.printStackTrace();
                }
            }
        }
    }

    /**
     * 選擇對象發送消息,參數peerTalk為發送的用戶名,后面的參數為發送的消息
     */
    public boolean peerTalk(String peerTalk, String talkMessage) {
        //
        for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) {
            Socket userClient = (Socket) enu.nextElement();
            // 找到發送消息的對象,獲取它的輸出流以發送消息
            if (peerTalk.equals((String) clientNameHash.get(userClient))
                    && !peerTalk.equals((String) clientNameHash.get(clientSocket))) {
                synchronized (clientDataHash) {
                    DataOutputStream peerOutData = (DataOutputStream) clientDataHash.get(userClient);
                    try {
                        peerOutData.writeUTF(talkMessage);
                    } catch (IOException es) {
                        es.printStackTrace();
                    }
                }
                Feedback(talkMessage);
                return (false);
            }
            // 如果是發給自己的,直接回饋
            else if (peerTalk.equals((String) clientNameHash.get(clientSocket))) {
                Feedback(talkMessage);
                return (false);
            }
        }

        return (true);

    }

    /**
     * 此函數也用于選擇發送消息,但不能發送給自己。
     */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国模无码大尺度一区二区三区| 国产成人一区二区精品非洲| 久久久无码精品亚洲日韩按摩| 88在线观看91蜜桃国自产| 欧美性猛交一区二区三区精品| 91在线精品一区二区| 成人美女视频在线观看| 国产在线一区二区| 久久91精品国产91久久小草| 麻豆精品一区二区综合av| 久久99国产精品久久99| 高清国产一区二区| 91在线你懂得| 欧美日韩在线一区二区| 欧美一级久久久| 精品国产区一区| 国产精品色婷婷| 国产精品的网站| 香蕉成人啪国产精品视频综合网| 午夜精品久久久久久久99水蜜桃| 国产精品日韩精品欧美在线| 免费看日韩精品| 国产电影一区在线| 91女人视频在线观看| 91精品国产综合久久精品图片| 日韩一区二区影院| 久久精品欧美日韩精品| 亚洲狼人国产精品| 精品一区中文字幕| 一本大道久久a久久综合| 337p亚洲精品色噜噜噜| 久久久www成人免费无遮挡大片| 中文字幕一区二区在线播放| 香蕉成人啪国产精品视频综合网 | 亚洲国产综合91精品麻豆| 日韩**一区毛片| 成人免费av在线| 欧美日韩国产美女| 国产蜜臀av在线一区二区三区| 夜色激情一区二区| 国产乱人伦精品一区二区在线观看| 97aⅴ精品视频一二三区| 欧美一级久久久| 一区二区三区在线观看国产 | 亚洲天堂2014| 免费在线观看成人| 色综合天天综合给合国产| 精品日韩欧美一区二区| 亚洲午夜精品一区二区三区他趣| 韩日av一区二区| 欧美高清视频一二三区 | 日韩欧美国产一二三区| 亚洲欧美偷拍卡通变态| 国产精品亚洲午夜一区二区三区 | 国产精品久久二区二区| 精品一区二区三区免费观看| 欧美日韩亚洲综合一区| 国产精品护士白丝一区av| 国内精品嫩模私拍在线| 8v天堂国产在线一区二区| 一区二区三区不卡视频在线观看| 国产激情一区二区三区桃花岛亚洲| 91.xcao| 亚洲激情自拍偷拍| 成人app软件下载大全免费| 精品美女一区二区| 老司机午夜精品99久久| 这里只有精品免费| 日韩国产在线一| 欧美日韩免费高清一区色橹橹| 亚洲欧美怡红院| 91在线观看高清| 国产精品伦一区| 99视频精品免费视频| 中文字幕一区二区三区在线观看| 国产高清在线精品| 国产人妖乱国产精品人妖| 国产1区2区3区精品美女| 久久精品欧美日韩精品| 国产乱码精品一品二品| 欧美国产日韩a欧美在线观看| 国产在线播精品第三| 国产日产欧美精品一区二区三区| 高潮精品一区videoshd| 国产精品福利电影一区二区三区四区| 成人自拍视频在线| 国产精品萝li| 欧美无乱码久久久免费午夜一区 | 国产黄色成人av| 国产精品视频免费| 波多野洁衣一区| 午夜亚洲福利老司机| 69av一区二区三区| 国产一区不卡在线| 日韩美女视频19| 欧美三级电影网站| 极品瑜伽女神91| 国产欧美日韩另类一区| 日本黄色一区二区| 六月婷婷色综合| 中文字幕在线不卡视频| 欧美三级日韩三级| 国产一区激情在线| 亚洲精选一二三| 日韩精品影音先锋| 99免费精品在线观看| 亚洲国产精品久久久男人的天堂 | 91精品国产欧美一区二区18| 国产一区在线观看视频| 亚洲精品视频自拍| 精品久久久久久最新网址| 国产在线播放一区三区四| 亚洲精品亚洲人成人网| 精品久久久网站| 色偷偷久久人人79超碰人人澡| 图片区小说区区亚洲影院| 国产欧美日韩视频一区二区| 欧美日韩中字一区| 成人在线综合网| 免费成人av在线| 亚洲欧美日韩国产综合| 亚洲精品在线一区二区| 在线观看不卡视频| 国产精品99久久久久| 亚洲成人av一区| 综合激情成人伊人| 久久久久久久综合色一本| 欧美日韩成人在线一区| 99精品国产热久久91蜜凸| 激情久久久久久久久久久久久久久久| 亚洲精品高清在线| 国产人妖乱国产精品人妖| 日韩精品一区二区三区在线 | 欧美性受极品xxxx喷水| 懂色中文一区二区在线播放| 日韩电影一区二区三区四区| 亚洲三级电影全部在线观看高清| 久久精品一区二区| 欧美大片日本大片免费观看| 欧美性xxxxxxxx| 欧美性生交片4| 在线观看av一区| 在线亚洲高清视频| 色网站国产精品| 色综合久久综合网欧美综合网| 成人黄色一级视频| 成人晚上爱看视频| 国产宾馆实践打屁股91| 国产综合久久久久影院| 韩国av一区二区| 黑人精品欧美一区二区蜜桃| 日本中文一区二区三区| 亚洲一区在线视频| 亚洲一区二区三区视频在线| 亚洲香肠在线观看| 亚洲二区在线观看| 亚洲成a人片综合在线| 午夜av一区二区| 人妖欧美一区二区| 免播放器亚洲一区| 国产美女视频一区| 成人国产精品免费网站| 欧美喷潮久久久xxxxx| 欧美日韩精品一二三区| 91精品国产一区二区| 51精品国自产在线| 精品三级在线看| 中文字幕精品一区| 国产精品久久久久影视| 欧美videos大乳护士334| 一区二区三区四区在线| 欧美一级高清片| 久久久国际精品| 亚洲欧洲日本在线| 亚洲电影第三页| 经典三级视频一区| 99久久久免费精品国产一区二区| 欧美性淫爽ww久久久久无| 欧美一区二区久久久| 国产欧美精品一区aⅴ影院| 国产免费久久精品| 亚洲福利一区二区| 国产精品69久久久久水密桃| 色综合天天综合网国产成人综合天| 欧美少妇xxx| 亚洲精品在线三区| 亚洲男人天堂av网| 国产一区二区三区| 91久久精品国产91性色tv| 日韩欧美国产综合在线一区二区三区 | 老司机一区二区| 不卡视频一二三| 欧美精品乱人伦久久久久久| 久久精品在线观看| 丝袜美腿亚洲一区二区图片| 成人免费视频caoporn| 欧美绝品在线观看成人午夜影视| 久久久青草青青国产亚洲免观| 18欧美亚洲精品| 国产一区在线不卡|