




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程設(shè)計(jì)報(bào)告( 2021- 2021年度第二學(xué)期)科目面向?qū)ο笳n程設(shè)計(jì)專業(yè)網(wǎng)絡(luò)工程學(xué)生姓名董志文班級(jí)13級(jí)2班學(xué)號(hào)1308020217指導(dǎo)教師江濤完成日期目 錄1 概 述.3 課程設(shè)計(jì)目的.3 1.2預(yù)備知識(shí).3 1.3課程設(shè)計(jì)內(nèi)容和要求.32 需求分析.4 2.1 系統(tǒng)目標(biāo).4 2.2 主體功能.4 2.3 開(kāi)發(fā)環(huán)境.4 2.4 概念設(shè)計(jì).43 系統(tǒng)總體設(shè)計(jì).5 3.1 系統(tǒng)的功能模塊劃分.5 3.2 系統(tǒng)流程圖.64系統(tǒng)詳細(xì)設(shè)計(jì).7 4.1 代碼實(shí)現(xiàn)情況.7 4. server 包 chessServer類.7 4.1.2 client包 chessClient類.7 4.1.3 ches
2、sface 包 chatPad類.8 4.1.4 chessface 包 chessPad類.8 4.1.5 chessface包c(diǎn)hessthread類.8 4. chessface 包 controlpad類.8 4. chessface 包 inputpad類.8 4. chessface 包userPad 類.94.1測(cè)試分析.9 4.2.1程序運(yùn)行情況.9 4.2.2程序運(yùn)行異常處理.125 小結(jié).12參考文獻(xiàn).13附 源代碼1、概述課程設(shè)計(jì)目的?JAVA程序設(shè)計(jì)?是計(jì)算機(jī)相關(guān)專業(yè)的必修專業(yè)根底課程,其實(shí)踐性、應(yīng)用性很強(qiáng)。實(shí)踐教學(xué)環(huán)節(jié)是必不可少的一個(gè)重要環(huán)節(jié)。本課程的程序設(shè)計(jì)專題實(shí)際
3、是計(jì)算機(jī)相關(guān)專業(yè)學(xué)生學(xué)習(xí)完?JAVA程序設(shè)計(jì)?課程后,進(jìn)行的一次全面的綜合訓(xùn)練,JAVA程序設(shè)計(jì)的設(shè)計(jì)目的是加深對(duì)理論教學(xué)內(nèi)容的理解和掌握,使學(xué)生較系統(tǒng)地掌握程序設(shè)計(jì)及其在網(wǎng)絡(luò)開(kāi)發(fā)中的廣泛應(yīng)用,根本方法及技巧,為學(xué)生綜合運(yùn)用所學(xué)知識(shí),利用軟件工程為根底進(jìn)行軟件開(kāi)發(fā)、并在實(shí)踐應(yīng)用方面打下一定根底。1.2預(yù)備知識(shí)熟悉JAVA語(yǔ)言及ECLIPSE開(kāi)發(fā)工具。1.3課程設(shè)計(jì)內(nèi)容和要求按課程設(shè)計(jì)指導(dǎo)書(shū)提供的課題,要求學(xué)生在自行完成各個(gè)操作環(huán)節(jié),并能實(shí)現(xiàn)且到達(dá)舉一反三的目的,完成一個(gè)工程解決一類問(wèn)題。要求學(xué)生能夠全面、深入理解和熟練掌握所學(xué)內(nèi)容,并能夠用其分析、設(shè)計(jì)和解答類似問(wèn)題;對(duì)此能夠較好地理解和掌握,
4、能夠進(jìn)行簡(jiǎn)單分析和判斷;能編寫(xiě)出具有良好風(fēng)格的程序;掌握J(rèn)AVA程序設(shè)計(jì)的根本技能和面向?qū)ο蟮母拍詈头椒ǎ涣私舛嗑€程、平安和網(wǎng)絡(luò)等編程技術(shù)。同時(shí)培養(yǎng)學(xué)生進(jìn)行分析問(wèn)題、解決問(wèn)題的能力;培養(yǎng)學(xué)生進(jìn)行設(shè)計(jì)分析、設(shè)計(jì)方法、設(shè)計(jì)操作與測(cè)試、設(shè)計(jì)過(guò)程的觀察、理解和歸納能力的提高。五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一。五子棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。 經(jīng)過(guò)一個(gè)學(xué)期的學(xué)習(xí),使我對(duì)Java有了一定的了解。但要深入理解Java語(yǔ)言,單靠上課是不夠的。必須通過(guò)課程設(shè)計(jì),設(shè)計(jì)一個(gè)比擬大的程序,才能更深一步地理解Java語(yǔ)言。在這次課程中,我選擇了網(wǎng)絡(luò)五子棋作為課題。編寫(xiě)網(wǎng)絡(luò)五子棋
5、游戲要利用到Socket網(wǎng)絡(luò)編程技術(shù)和多線程。通過(guò)這次課程設(shè)計(jì),熟悉Java的GUI圖形界面設(shè)計(jì),網(wǎng)絡(luò)Socket 編程和多線程編程。2 需求分析2.1 系統(tǒng)目標(biāo)本系統(tǒng)主要是完成五子棋游戲的根本操作,在玩游戲的過(guò)程中玩家可以放松心情得到娛樂(lè)。 2.2 主體功能本程序?qū)崿F(xiàn)了一個(gè)小的五子棋游戲,可以實(shí)現(xiàn)兩個(gè)人在用一臺(tái)機(jī)器上進(jìn)行游戲。程序會(huì)自動(dòng)判斷誰(shuí)輸誰(shuí)贏,在游戲的開(kāi)始,第一個(gè)人可以選擇執(zhí)白棋還是黑棋,之后點(diǎn)擊開(kāi)始進(jìn)行游戲。2.3 開(kāi)發(fā)環(huán)境硬件要求能運(yùn)行Eclipse的windows xp以上系統(tǒng)。JAVA程序設(shè)計(jì)語(yǔ)言及相應(yīng)的集成開(kāi)發(fā)環(huán)境,SDK和ECLIPSE開(kāi)發(fā)工具。網(wǎng)絡(luò)五子棋是采用網(wǎng)絡(luò)協(xié)議為T(mén)
6、CP/IP的網(wǎng)上對(duì)弈游戲,運(yùn)用“客戶端效勞器“(c/s)網(wǎng)絡(luò)架構(gòu)模式。實(shí)現(xiàn)用戶通過(guò)Internt連接在任何地方與不同玩家進(jìn)行對(duì)戰(zhàn)。效勞器可以創(chuàng)立任意多局游戲。通過(guò)使用多線程和網(wǎng)絡(luò)套接字SOCKET來(lái)實(shí)現(xiàn)游戲之間的通訊,它是基于點(diǎn)對(duì)點(diǎn)的通訊。開(kāi)始讓效勞器初始化建立效勞器套接字SOCKET,基于某個(gè)端口PORT,效勞器始終處于監(jiān)聽(tīng)狀態(tài)??蛻舳耸莿?dòng)作的發(fā)起者,何時(shí)發(fā)出申請(qǐng)由客戶端決定??蛻舳讼蛐谄靼l(fā)出申請(qǐng),效勞器給予響應(yīng)。翻開(kāi)客戶端套接字SOCKET,連接到效勞器端的地址ADDRESS和端口PORT。連接建立后,創(chuàng)立一個(gè)SOCKET實(shí)例,并開(kāi)始一個(gè)線程,監(jiān)聽(tīng)該客戶端請(qǐng)求。效勞器繼續(xù)監(jiān)聽(tīng)其它用戶的連
7、接。效勞器通過(guò)數(shù)據(jù)輸入流從客戶端接收信息,并且通過(guò)數(shù)據(jù)輸出流把相應(yīng)的信息發(fā)送給客戶端??蛻舳税l(fā)送請(qǐng)求和響應(yīng)接收到的各種信息。 在效勞器和客戶端之間傳遞的消息格式是采用“消息類別+內(nèi)容“組成的,效勞器和客戶端在傳遞消息的過(guò)程,根據(jù)消息的類別來(lái)進(jìn)行相關(guān)的操作。3 系統(tǒng)總體設(shè)計(jì)3.1 系統(tǒng)的功能模塊示意圖3.2 系統(tǒng)流程圖4系統(tǒng)詳細(xì)設(shè)計(jì)4.1 代碼實(shí)現(xiàn)情況4.1.1 server 包 chessServer類class MessageServerPanel extends Panel /主消息窗口class ServerThread extends Thread /效勞器線程,主要用于效勞器與客戶端
8、的通信public class chessServer extends Frame implements ActionListener /效勞器端框架類4.1.2 client包 chessClient類public class chessClient extends Frame implements ActionListener, KeyListener /五子棋客戶端框架,實(shí)現(xiàn)了動(dòng)作監(jiān)聽(tīng)器和鍵盤(pán)監(jiān)聽(tīng)器public boolean connectServer(String serverIP, int serverPort) throws Exception /和效勞器建立連接并通信的函數(shù)。r
9、eturn true 連接成功, false 如果失敗.4.1.3 chessface 包 chatPad類public class chatPad extends Panel /聊天信息Panel。Panel上的文本域可以顯示用戶聊天信息。4.1.4 chessface 包 chessPad類public class chessPad extends Panel implements MouseListener /顯示棋盤(pán)的Panel。此Panel實(shí)現(xiàn)了鼠標(biāo)監(jiān)聽(tīng)器class chessPoint_black extends Canvas /表示黑子的類class chessPoint_whi
10、te extends Canvas /表示白子的類4.1.5 chessface包c(diǎn)hessthread類public class chessThread extends Thread /一個(gè)客戶端用戶線程. 處理用戶落子的點(diǎn)擊事件處理,及消息發(fā)送.4.1.6 chessface 包 controlpad類public class controlPad extends Panel /控制Panel。此Panel上的按鈕如其名,完成相應(yīng)的功能。4.1.7 chessface 包 inputpad類public class inputPad extends Panel /輸入信息Panel。Pan
11、el左邊的下拉列表中列出了所有用戶的名字。右邊的文本框可以輸入聊天信息,點(diǎn)擊回車信息被發(fā)送。4.1.8 chessface 包userPad 類public class userPad extends Panel /用戶列表Panel。此Panel維護(hù)一個(gè)效勞器的當(dāng)前用戶列表, 所有的用戶名都將顯示在列表中。4.2 測(cè)試分析/翻開(kāi)效勞端/翻開(kāi)客戶端/落子/判定啟動(dòng)游戲時(shí),應(yīng)先啟動(dòng)效勞端,然后翻開(kāi)客戶端,連接效勞端,建立游戲,參加游戲,然后落子。在啟動(dòng)客戶端時(shí),假設(shè)是閃退,請(qǐng)先關(guān)閉效勞端,然后重啟。5 小結(jié)經(jīng)過(guò)為期二周的課程設(shè)計(jì),感覺(jué)自己所學(xué)遠(yuǎn)遠(yuǎn)不能解決做課設(shè)時(shí)的需求。在熟悉課本和上網(wǎng)搜索后,才
12、算馬馬虎虎的完成了任務(wù)。 在畫(huà)棋盤(pán)時(shí),調(diào)用draw方法對(duì)于畫(huà)圖這塊的坐標(biāo)布置,在今后學(xué)畫(huà)其他圖畫(huà)時(shí)能夠得心應(yīng)手。獲取棋子方法的巧妙,注冊(cè)鼠標(biāo),獲取點(diǎn)擊位置,除以棋盤(pán)間隔,去掉不為整數(shù)的一塊,再乘以棋盤(pán)間隔便獲得最臨近點(diǎn)的下棋坐標(biāo),即所要下棋的位置。用二維數(shù)組模擬棋盤(pán),無(wú)棋子的置為0,黑子置為1,白子置為2,以便在判斷勝負(fù)時(shí)利于同色棋子的查找。整個(gè)棋盤(pán)就模擬出來(lái)了,很巧妙,不過(guò)有更好的方法用向量存儲(chǔ)棋子信息,便于悔棋等操作。 實(shí)現(xiàn)多用戶聊天,老師后面講的不是很多,做起來(lái)有點(diǎn)費(fèi)力。參考網(wǎng)上資料,明白Socket原理。開(kāi)始時(shí)照著課本上的例子,不能得出想要的效果,而且只運(yùn)行了一個(gè)程序看不到有通信的效果
13、。后面在運(yùn)行了Server類后,自己嘗試著兩個(gè)Client類,實(shí)現(xiàn)了通話,就像騰訊QQ里面一樣的效果。里面定義了Vector 線程,實(shí)現(xiàn)了多線程用法。 兩個(gè)板塊大體實(shí)現(xiàn),但是后面的要求五,由于數(shù)據(jù)庫(kù)的使用不是太熟悉,不能注冊(cè)用戶,添加好友,查找好友,還有悔棋操作未能實(shí)現(xiàn)。此程序最大的缺點(diǎn)還在于,不能實(shí)現(xiàn)網(wǎng)絡(luò)兩人下五子棋。由于不能將棋盤(pán)信息與聊天信息區(qū)分,不能告訴對(duì)反自己下了哪一步,所以根據(jù)自己的水平也就能做到這了,今后加以完善。參考文獻(xiàn)1. 孫衛(wèi)琴 Java面向?qū)ο蠼坛?電子工業(yè)出版社 2006-03 2.孫衛(wèi)琴 Java網(wǎng)絡(luò)編程精解 電子工業(yè)出版社 2006-03 3.張仕斌 Java程序設(shè)
14、計(jì)與應(yīng)用 清華大學(xué)出版社 2005-06 4.張孝祥 Java就業(yè)培訓(xùn)程序 清華大學(xué)出版社 2003-06 5.耿祥義 Java課程設(shè)計(jì) 清華大學(xué)出版社 2004-03 6.王路群 Java高級(jí)程序設(shè)計(jì) 中國(guó)水利水電出版社 2006-03 7.丁振凡 Java語(yǔ)言使用教程 北京郵電大學(xué)出版社 2005-06 8.薛為民 Java應(yīng)用教程 清華大學(xué)出版社 2005-06 9.鐘允中 JAVA入門(mén) 遼寧科學(xué)技術(shù)出版社 1997-03 10.鄭莉 Java語(yǔ)言程序設(shè)計(jì) 清華大學(xué)出版社 2006-03附 源碼1、server包中chessServer類:package server;import ja
15、va.io.*;import .*;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("當(dāng)前連接數(shù):", Labe
16、l.LEFT); Panel boardPanel = new Panel();/ 主顯示區(qū)Panel Panel statusPanel = new Panel();/ 連接狀態(tài)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
17、 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 clien
18、tDataHash;/ Socket與發(fā)送數(shù)據(jù)的流的映射 Hashtable clientNameHash;/ Socket與用戶名的映射 Hashtable chessPeerHash;/ 對(duì)弈的兩個(gè)客戶端用戶名的映射 MessageServerPanel server; boolean isClientClosed = false; /* * 效勞器端線程的構(gòu)造函數(shù),用于初始化一些對(duì)象。 */ ServerThread(Socket clientSocket, Hashtable clientDataHash, Hashtable clientNameHash, Hashtable che
19、ssPeerHash, MessageServerPanel server) this.clientSocket = clientSocket; this.clientDataHash = clientDataHash; this.clientNameHash = clientNameHash; this.chessPeerHash = chessPeerHash; this.server = server; /* * 對(duì)客戶端發(fā)來(lái)的消息處理的函數(shù),處理后轉(zhuǎn)發(fā)回客戶端。處理消息的過(guò)程比擬復(fù)雜, 要針對(duì)很多種情況分別處理。 */ public void messageTransfer(Strin
20、g message) String clientName, peerName; /命令處理/ / 如果消息以“/開(kāi)頭,說(shuō)明是命令消息。 if (message.startsWith("/") / 如果消息以“/list開(kāi)頭,那么將其回饋到客戶端以更新用戶列表 if (message.equals("/list") Feedback(getUserList(); / 如果消息以"/creatgame inchess"開(kāi)頭,那么修改clientNameHash映射 / 和chessPeerHash映射。 else if (message.
21、startsWith("/creatgame inchess") / String chessServerName = message.substring(20); synchronized (clientNameHash) clientNameHash.put(clientSocket, message.substring(11); synchronized (chessPeerHash) /剛創(chuàng)立,等待其他人參加 chessPeerHash.put(chessServerName, "wait"); Feedback("/yourname
22、" + clientNameHash.get(clientSocket); chessPeerTalk(chessServerName, "/OK"); publicTalk(getUserList(); / 如果消息以“/joingame開(kāi)頭,那么將消息的效勞端名字和本地用戶名提取出來(lái), / 然后修改clientNameHash表和chessPeerHash表。 if (message.startsWith("/joingame ") StringTokenizer userToken = new StringTokenizer(messag
23、e, " "); String getUserToken, serverName, selfName; String chessNameOpt = "0", "0" int getOptNum = 0; / 提取效勞端用戶名和本地用戶名 while (userToken.hasMoreTokens() getUserToken = (String) userToken.nextToken(" "); if (getOptNum >= 1 && getOptNum <= 2) chessN
24、ameOptgetOptNum - 1 = getUserToken; getOptNum+; serverName = chessNameOpt0; selfName = chessNameOpt1; / 如果有效勞端在等待開(kāi)始棋局 if (chessPeerHash.containsKey(serverName) && chessPeerHash.get(serverName).equals("wait") / 修改Socket和名字映射 synchronized (clientNameHash) clientNameHash.put(clientSoc
25、ket, ("inchess" + selfName); / 修改chessPeerHash映射 synchronized (chessPeerHash) chessPeerHash.put(serverName, selfName); publicTalk(getUserList(); chessPeerTalk(selfName, ("/peer " + "inchess" + serverName); chessPeerTalk(serverName, ("/peer " + "inchess&qu
26、ot; + selfName); else chessPeerTalk(selfName, "/reject"); try clientClose(); catch (Exception ez) / 如果消息以“/inchess開(kāi)頭,那么獲取要發(fā)送消息的用戶名和發(fā)送的消息 / 然后發(fā)送出去。 else if (message.startsWith("/inchess") int firstLocation = 0, lastLocation; lastLocation = message.indexOf(" ", 0); peerNa
27、me = message.substring(firstLocation + 1), lastLocation); message = message.substring(lastLocation + 1); if (chessPeerTalk(peerName, message) Feedback("/error"); / 如果消息以“/giveup開(kāi)頭,那么判斷是對(duì)弈雙方哪方放棄了。 else if (message.startsWith("/giveup ") String chessClientName = message.substring(8
28、); if (chessPeerHash.containsKey(chessClientName) && !(String) chessPeerHash.get(chessClientName).equals("wait") / 如果效勞方放棄,那么發(fā)送消息“/youwin說(shuō)明對(duì)方獲勝 chessPeerTalk(String) chessPeerHash.get(chessClientName), "/youwin"); /剔除這對(duì)對(duì)弈的人。 synchronized (chessPeerHash) chessPeerHash.remo
29、ve(chessClientName); if (chessPeerHash.containsValue(chessClientName) / 如果客戶方放棄,也發(fā)送消息“/youwin說(shuō)明對(duì)方獲勝 chessPeerTalk(String) getHashKey(chessPeerHash, chessClientName), "/youwin"); synchronized (chessPeerHash) chessPeerHash.remove(String) getHashKey(chessPeerHash, chessClientName); / 如果找不到發(fā)送消
30、息的用戶,那么輸出消息說(shuō)“沒(méi)有這個(gè)用戶 else int firstLocation = 0, lastLocation; lastLocation = message.indexOf(" ", 0); if (lastLocation = -1) Feedback("無(wú)效命令"); return; else peerName = message.substring(firstLocation + 1), lastLocation); message = message.substring(lastLocation + 1); message = (St
31、ring) clientNameHash.get(clientSocket) + ">" + message; if (peerTalk(peerName, message) Feedback("沒(méi)有這個(gè)用戶:" + peerName + "n"); / / / 如果不以“/開(kāi)頭,說(shuō)明是普通消息,直接發(fā)送 else message = clientNameHash.get(clientSocket) + ">" + message; server.messageBoard.append(message
32、+ "n"); publicTalk(message); server.messageBoard.setCaretPosition(server.messageBoard.getText().length(); /* * 發(fā)送公共消息的函數(shù),將消息向每個(gè)客戶端都發(fā)送一份 */ public void publicTalk(String publicTalkMessage) synchronized (clientDataHash) /枚舉遍歷所有客戶端輸出流。 for (Enumeration enu = clientDataHash.elements(); enu.has
33、MoreElements();) DataOutputStream outData = (DataOutputStream) enu.nextElement(); try /輸出信息。這里會(huì)阻塞 outData.writeUTF(publicTalkMessage); catch (IOException es) /打印異常堆棧。終止程序。 es.printStackTrace(); /* * 選擇對(duì)象發(fā)送消息,參數(shù)peerTalk為發(fā)送的用戶名,后面的參數(shù)為發(fā)送的消息 */ public boolean peerTalk(String peerTalk, String talkMessage
34、) / for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) Socket userClient = (Socket) enu.nextElement(); / 找到發(fā)送消息的對(duì)象,獲取它的輸出流以發(fā)送消息 if (peerTalk.equals(String) clientNameHash.get(userClient) && !peerTalk.equals(String) clientNameHash.get(clientSocket) synchronized (clientDataH
35、ash) DataOutputStream peerOutData = (DataOutputStream) clientDataHash.get(userClient); try peerOutData.writeUTF(talkMessage); catch (IOException es) es.printStackTrace(); Feedback(talkMessage); return (false); / 如果是發(fā)給自己的,直接回饋 else if (peerTalk.equals(String) clientNameHash.get(clientSocket) Feedback
36、(talkMessage); return (false); return (true); /* * 此函數(shù)也用于選擇發(fā)送消息,但不能發(fā)送給自己。 */ public boolean chessPeerTalk(String chessPeerTalk, String chessTalkMessage) for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) Socket userClient = (Socket) enu.nextElement(); if (chessPeerTalk.equals(Stri
37、ng) clientNameHash.get(userClient) && !chessPeerTalk.equals(String) clientNameHash.get(clientSocket) synchronized (clientDataHash) DataOutputStream peerOutData = (DataOutputStream) clientDataHash.get(userClient); try peerOutData.writeUTF(chessTalkMessage); catch (IOException es) es.printStac
38、kTrace(); return (false); return (true); /* * 用于處理消息回饋的函數(shù) */ public void Feedback(String feedbackString) synchronized (clientDataHash) /得到輸出流。 DataOutputStream outData = (DataOutputStream) clientDataHash.get(clientSocket); try /輸出信息。 outData.writeUTF(feedbackString); catch (Exception eb) /打印堆棧軌跡,程序終
39、止。 eb.printStackTrace(); /* * 獲取用戶列表的函數(shù),此函數(shù)讀取clientNameHash獲取用戶列表, 然后將其保存在一個(gè)字符串userList中。 */ public String getUserList() String userList = "/userlist" /遍歷hashtable中的values,以空格分割連接起來(lái) for (Enumeration enu = clientNameHash.elements(); enu.hasMoreElements();) userList = userList + " "
40、; + (String) enu.nextElement(); return userList; /* * 給出HashTable和值對(duì)象,獲取相對(duì)應(yīng)得鍵值的函數(shù)。 */ public Object getHashKey(Hashtable targetHash, Object hashValue) Object hashKey; for (Enumeration enu = targetHash.keys(); enu.hasMoreElements();) hashKey = (Object) enu.nextElement(); /如果鍵對(duì)應(yīng)的值與hashValue相等,那么返回這個(gè)ke
41、y if (hashValue.equals(Object) targetHash.get(hashKey) return (hashKey); return (null); public void firstCome() /新用戶第一次參加、播送用戶列表。 publicTalk(getUserList(); /反應(yīng)給這個(gè)用戶,以修改相應(yīng)顯示信息。 Feedback("/yourname " + (String) clientNameHash.get(clientSocket); Feedback("Java五子棋聊天客戶端"); Feedback(&q
42、uot;/changename <你的名字> -更改名字"); Feedback("/list -更新用戶列表"); Feedback("/<用戶名> <要說(shuō)的話> -私聊"); Feedback("注意:用命令的時(shí)候,先把談話的對(duì)象定為所有人"); /* * 用于和客戶端斷開(kāi)的函數(shù)。 */ public void clientClose() server.messageBoard.append("用戶斷開(kāi):" + clientSocket + "n"); / 如果是游戲客戶端主機(jī) synchronized (chessPeerHash) if (chessPeerHash.containsKey(clientNameHash.get(clientSocket) chessPeerHash.remove(String) clientNameHash.get(clientSocket); if (chessPeerHash.containsValue(clientNameHash.get(clientSocket) chessPeerHas
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度退股及員工持股計(jì)劃合同
- 個(gè)人股權(quán)轉(zhuǎn)讓合同2025年度含業(yè)績(jī)對(duì)賭條款
- 二零二五年度臨時(shí)項(xiàng)目經(jīng)理職務(wù)聘用與成果轉(zhuǎn)化合同
- 二零二五年度旅游團(tuán)隊(duì)保險(xiǎn)責(zé)任免除聲明
- 電線電纜購(gòu)銷合同
- 管理層勞動(dòng)合同工資
- 個(gè)人數(shù)字資產(chǎn)管理協(xié)議
- 全新池塘出租協(xié)議
- 月餅產(chǎn)品代銷合同
- 鄉(xiāng)村旅游發(fā)展策略與實(shí)施方案
- AQ6111-2023個(gè)體防護(hù)裝備安全管理規(guī)范
- GGD交流低壓配電柜運(yùn)行、維護(hù)說(shuō)明書(shū)、安裝、操作手冊(cè)
- JCT2354-2016 衛(wèi)生陶瓷企業(yè)安全生產(chǎn)規(guī)范
- 2024年全國(guó)國(guó)家版圖(中小學(xué)組)知識(shí)競(jìng)賽題庫(kù)及答案
- QBT 2605-2003 工業(yè)氯化鎂行業(yè)標(biāo)準(zhǔn)
- 2024年江西機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)帶答案
- 《拒絕沉迷手機(jī)遠(yuǎn)離“垃圾快樂(lè)”》班會(huì)課件
- 普通高中政治課程標(biāo)準(zhǔn)測(cè)試題及答案
- 2024年知識(shí)競(jìng)賽-《民用爆炸物品安全管理?xiàng)l例》知識(shí)競(jìng)賽筆試參考題庫(kù)含答案
- 屋頂 屋頂?shù)呐潘O(shè)計(jì) 屋頂?shù)呐潘绞剑ńㄖ?gòu)造)
- Web-of-sciencenew文獻(xiàn)檢索-課件
評(píng)論
0/150
提交評(píng)論