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

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

?? chessserver.java

?? 本實例是用java實現的網絡五子棋程序。程序由兩個部分組成:一部分為服務器端
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:

package com.fivechess.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("/")) {
        //消息以“/changename”開頭的幾種情況.
			if (message.startsWith("/changename ")) {
				//獲取修改后的用戶名
				clientName = message.substring(12);
				if (clientName.length() <= 0 || clientName.length() > 20
						|| clientName.startsWith("/")
						|| clientNameHash.containsValue(clientName)
						|| clientName.startsWith("changename")
						|| clientName.startsWith("list")
						|| clientName.startsWith("[inchess]")
						|| clientName.startsWith("creatgame")
						|| clientName.startsWith("joingame")
						|| clientName.startsWith("yourname")
						|| clientName.startsWith("userlist")
						|| clientName.startsWith("chess")
						|| clientName.startsWith("OK")
						|| clientName.startsWith("reject")
						|| clientName.startsWith("peer")
						|| clientName.startsWith("peername")
						|| clientName.startsWith("giveup")
						|| clientName.startsWith("youwin")
						|| clientName.startsWith("所有人")) {
					//如果名字不合規則,則向客戶端發送信息“無效命令”。
					message = "無效命令";
					Feedback(message);
				} else {
					if (clientNameHash
							.containsValue(("[inchess]" + (String) clientNameHash
									.get(clientSocket)))) {
				    //如果用戶正在對弈中,則直接修改Socket和名字的映射Hash表。
						synchronized (clientNameHash) {
							clientNameHash.put((Socket) getHashKey(
									clientNameHash,
									("[inchess]" + clientNameHash
											.get(clientSocket))),
									("[inchess]" + clientName));
							chessPeerTalk(("[inchess" + clientName),
									("/yourname " + ("[inchess]" + clientName)));
						}
					} 
					//如果用戶在對弈雙方的客戶端,做如下處理。
					else if (chessPeerHash.containsKey(clientNameHash
							.get(clientSocket))) {
						//將客戶端的新名字映射到clientNameHash
						synchronized (clientNameHash) {
							clientNameHash.put((Socket) getHashKey(
									clientNameHash,
									("[inchess]" + clientNameHash
											.get(clientSocket))),
									("[inchess]" + clientName));
						}

						synchronized (chessPeerHash) {
							//chessPeerHash添加新名字映射
							chessPeerHash.put(clientName, chessPeerHash
									.get(clientNameHash.get(clientSocket)));
							//chessPeerHash刪除舊映射
							chessPeerHash.remove(clientNameHash
									.get(clientSocket));
						}
						//向游戲客戶端發送新名字
						chessPeerTalk(("[inchess]" + clientName),
								("/yourname " + ("[inchess]" + clientName)));
						//向peer游戲客戶端發送
						chessPeerTalk((String) chessPeerHash.get(clientName),
								("/peer " + "[inchess]" + clientName));

					} 
//					如果用戶在對弈雙方的服務端,做如下處理。
					else if (chessPeerHash.containsValue(clientNameHash
							.get(clientSocket))) {
						synchronized (clientNameHash) {
							//游戲客戶端改名字
							clientNameHash.put((Socket) getHashKey(
									clientNameHash,
									("[inchess]" + clientNameHash
											.get(clientSocket))),
									("[inchess]" + clientName));
						}
						synchronized (chessPeerHash) {
							//chessPeerHash重新映射
							chessPeerHash.put((String) getHashKey(
									chessPeerHash, clientNameHash
											.get(clientSocket)), clientName);
							//向游戲客戶端發送新名字
							chessPeerTalk(("[inchess]" + clientName),
									("/yourname " + ("[inchess]" + clientName)));
						}
						//向peer游戲客戶端發送
						chessPeerTalk((String) getHashKey(chessPeerHash,
								clientName),
								("/peer " + "[inchess]" + clientName));

					}
                    //將改名消息封裝好以備發送
					message = clientNameHash.get(clientSocket) + "改名為:"
							+ clientName;
					synchronized (clientNameHash) {
						clientNameHash.put(clientSocket, clientName);
					}
					//向所有的客戶端發送消息
					publicTalk(message);
					//回饋到改名的客戶端
					Feedback("/yourname "
							+ (String) clientNameHash.get(clientSocket));
					//刷新用戶列表
					publicTalk(getUserList());

				}

			} 
			//如果消息以“/list”開頭,則將其回饋到客戶端以更新用戶列表
			else 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表。
			else 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());
		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲大尺度视频在线观看| 国产精品欧美一区二区三区| 99久久精品国产精品久久| 精品一区二区三区不卡| 日韩成人免费电影| 毛片一区二区三区| 国产一区中文字幕| 国产精品资源站在线| 国产激情一区二区三区四区 | 色综合色综合色综合色综合色综合 | 久久久久久久久久美女| 精品久久久三级丝袜| 久久影院电视剧免费观看| 久久久久九九视频| 亚洲国产精品精华液ab| 国产精品灌醉下药二区| 夜夜爽夜夜爽精品视频| 三级影片在线观看欧美日韩一区二区 | 成人精品一区二区三区四区| 波多野结衣的一区二区三区| 欧美丰满高潮xxxx喷水动漫| 精品久久久网站| 国产精品人妖ts系列视频| 亚洲嫩草精品久久| 强制捆绑调教一区二区| 高清av一区二区| 在线观看亚洲一区| 欧美电影免费观看高清完整版在 | 久久精品一级爱片| 亚洲欧美日韩一区二区| 日韩精品一卡二卡三卡四卡无卡| 国产一区中文字幕| 91久久精品网| 欧美精品一区二| 一区二区三区在线视频观看| 久久精品国产99| 99vv1com这只有精品| 日韩一区二区三区观看| 国产精品久久久久久久久久久免费看 | 久久久久青草大香线综合精品| 一区二区不卡在线播放 | 欧美一区二区三区四区在线观看| 日韩欧美资源站| 中文字幕精品三区| 午夜精品福利一区二区三区av| 国产精一区二区三区| 精品视频1区2区| 国产精品理伦片| 久草在线在线精品观看| 欧洲生活片亚洲生活在线观看| 精品国产乱码久久久久久1区2区| 亚洲一区二区中文在线| 不卡免费追剧大全电视剧网站| 欧美一区二区三区四区高清| 一区二区三区在线免费播放 | 亚洲亚洲人成综合网络| 国产成a人无v码亚洲福利| 欧美一级国产精品| 亚洲一区二区中文在线| 色综合夜色一区| 国产精品护士白丝一区av| 国产一区二区视频在线| 日韩精品一区国产麻豆| 日本欧美肥老太交大片| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 中文字幕第一页久久| 国产资源精品在线观看| 日韩欧美国产系列| 蜜桃在线一区二区三区| 欧美一级黄色片| 另类调教123区| 欧美成人精品3d动漫h| 日本色综合中文字幕| 欧美精品tushy高清| 午夜精品久久久久久久| 91精品国产色综合久久不卡蜜臀| 亚洲国产精品久久人人爱| 色综合av在线| 亚洲成人免费av| 欧美军同video69gay| 奇米影视一区二区三区小说| 在线不卡的av| 老司机精品视频一区二区三区| 日韩免费视频一区| 精品一区二区三区在线播放视频| 精品国产区一区| 国产91在线观看丝袜| 国产精品久久久久久久久免费桃花 | 国产亚洲综合色| 成人免费视频免费观看| 亚洲免费观看高清| 欧美日韩大陆在线| 久久精品噜噜噜成人av农村| 欧美精品一区二区三区蜜桃视频| 国产成人午夜99999| √…a在线天堂一区| 精品婷婷伊人一区三区三| 日韩av在线播放中文字幕| 欧美精品一区二区三区四区| 成人激情图片网| 爽爽淫人综合网网站| 精品福利视频一区二区三区| av亚洲产国偷v产偷v自拍| 一区视频在线播放| 欧美一区二区在线播放| 国产成人精品影视| 亚洲国产cao| 亚洲国产精品精华液2区45| 欧美亚洲愉拍一区二区| 激情文学综合丁香| 亚洲精品乱码久久久久久黑人| 7777精品伊人久久久大香线蕉 | 亚洲chinese男男1069| 日韩免费看的电影| 色综合久久久久久久久| 蓝色福利精品导航| 夜夜嗨av一区二区三区中文字幕| 91麻豆精品国产自产在线观看一区 | 国产乱人伦偷精品视频不卡| 亚洲线精品一区二区三区八戒| wwww国产精品欧美| 欧美三级电影在线看| 成人av资源站| 精品制服美女久久| 亚洲h精品动漫在线观看| 国产精品久久久久毛片软件| 日韩欧美二区三区| 欧美日韩dvd在线观看| 成人黄页毛片网站| 国产伦精品一区二区三区视频青涩| 亚洲国产日日夜夜| 中文字幕在线观看一区| 精品国产凹凸成av人网站| 欧美性三三影院| 色综合网色综合| 国产a级毛片一区| 国产在线播放一区二区三区| 日韩av不卡在线观看| 亚洲成人中文在线| 一区二区在线观看不卡| **网站欧美大片在线观看| 久久久午夜精品理论片中文字幕| 欧美电影在哪看比较好| 欧美日韩一区小说| 欧美色涩在线第一页| 91视频免费观看| 色婷婷久久综合| 欧美日韩国产精品成人| 久久精品人人做人人爽人人| 国产成人激情av| 国产另类ts人妖一区二区| 激情五月播播久久久精品| 麻豆成人在线观看| 久久电影网电视剧免费观看| 日韩高清不卡一区二区三区| 午夜精品久久久久影视| 亚洲超碰97人人做人人爱| 亚洲mv在线观看| 日日噜噜夜夜狠狠视频欧美人 | 亚洲成a人片综合在线| 亚洲一区二区三区在线看| 亚洲一区二区三区四区的| 亚洲国产综合在线| 亚洲成人精品在线观看| 日韩国产欧美视频| 精品一区二区在线免费观看| 国产一本一道久久香蕉| 国产精品 日产精品 欧美精品| fc2成人免费人成在线观看播放| 91社区在线播放| 欧美日韩视频在线第一区 | 日韩成人免费看| 精彩视频一区二区| 不卡av电影在线播放| 欧美亚洲愉拍一区二区| 欧美精品777| 国产无人区一区二区三区| 国产精品高潮久久久久无| 亚洲一区二三区| 91丝袜美女网| 4438x亚洲最大成人网| 久久久国产精品麻豆| 亚洲另类一区二区| 奇米精品一区二区三区在线观看一| 国产高清久久久| 一本到不卡免费一区二区| 欧美一区二区免费视频| 国产欧美一区二区精品性| 亚洲亚洲精品在线观看| 国产最新精品精品你懂的| 91麻豆swag| 亚洲精品一区在线观看| 亚洲综合色成人| 国产成都精品91一区二区三| 欧美男生操女生| 中文字幕av一区二区三区免费看| 日韩高清不卡一区二区三区| 99re成人在线| 久久一日本道色综合| 丝瓜av网站精品一区二区|