2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩59頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  課程設計報告</b></p><p>  ( 2014-- 2015年度第二學期)</p><p> 科目面向對象課程設計</p><p><b>  目 錄</b></p><p>  1 概 述..............................

2、..............3</p><p>  1.1課程設計目的....................................3</p><p>  1.2預備知識........................................3</p><p>  1.3課程設計內容和要求..............................

3、3</p><p>  2 需求分析...........................................4</p><p>  2.1 系統目標.......................................4</p><p>  2.2 主體功能.......................................4<

4、/p><p>  2.3 開發環境.......................................4</p><p>  2.4 概念設計.......................................4</p><p>  3 系統總體設計.......................................5</p>

5、<p>  3.1 系統的功能模塊劃分.............................5</p><p>  3.2 系統流程圖.....................................6</p><p>  4系統詳細設計.......................................7</p><p>  4.

6、1 代碼實現情況...................................7</p><p>  4.1.1 server 包 chessServer類...................7</p><p>  4..1.2 client包 chessClient類..................7</p><p>  4.1.3 chessfac

7、e 包 chatPad類....................8</p><p>  4.1.4 chessface 包 chessPad類...................8</p><p>  4.1.5 chessface包chessthread類.................8</p><p>  4.1.6 chessface 包 control

8、pad類.................8</p><p>  4.1.7 chessface 包 inputpad類...................8</p><p>  4.1.8 chessface 包userPad 類....................9</p><p>  4.1測試分析............................

9、............9</p><p>  4.2.1程序運行情況................................9</p><p>  4.2.2程序運行異常處理...........................12</p><p>  5 小結...............................................1

10、2</p><p>  參考文獻.............................................13</p><p><b>  附 源代碼</b></p><p><b>  1、概述</b></p><p><b>  1.1課程設計目的</b>&

11、lt;/p><p>  《JAVA程序設計》是計算機相關專業的必修專業基礎課程,其實踐性、應用性很強。實踐教學環節是必不可少的一個重要環節。本課程的程序設計專題實際是計算機相關專業學生學習完《JAVA程序設計》課程后,進行的一次全面的綜合訓練,JAVA程序設計的設計目的是加深對理論教學內容的理解和掌握,使學生較系統地掌握程序設計及其在網絡開發中的廣泛應用,基本方法及技巧,為學生綜合運用所學知識,利用軟件工程為基礎進行

12、軟件開發、并在實踐應用方面打下一定基礎。</p><p><b>  1.2預備知識</b></p><p>  熟悉JAVA語言及ECLIPSE開發工具。</p><p>  1.3課程設計內容和要求</p><p>  按課程設計指導書提供的課題,要求學生在自行完成各個操作環節,并能實現且達到舉一反三的目的,完成一個

13、項目解決一類問題。要求學生能夠全面、深入理解和熟練掌握所學內容,并能夠用其分析、設計和解答類似問題;對此能夠較好地理解和掌握,能夠進行簡單分析和判斷;能編寫出具有良好風格的程序;掌握JAVA程序設計的基本技能和面向對象的概念和方法;了解多線程、安全和網絡等編程技術。同時培養學生進行分析問題、解決問題的能力;培養學生進行設計分析、設計方法、設計操作與測試、設計過程的觀察、理解和歸納能力的提高。</p><p>  

14、五子棋是起源于中國古代的傳統黑白棋種之一。五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養性。 經過一個學期的學習,使我對Java有了一定的了解。但要深入理解Java語言,單靠上課是不夠的。必須通過課程設計,設計一個比較大的程序,才能更深一步地理解Java語言。在這次課程中,我選擇了網絡五子棋作為課題。編寫網絡五子棋游戲要利用到Socket網絡編程技術和多線程。通過這次課程設計,熟悉Java的GUI圖形界面設計,網絡So

15、cket 編程和多線程編程。</p><p><b>  2 需求分析</b></p><p><b>  2.1 系統目標</b></p><p>  本系統主要是完成五子棋游戲的基本操作,在玩游戲的過程中玩家可以放松心情得到娛樂。 </p><p><b>  2.2 主體功能<

16、/b></p><p>  本程序實現了一個小的五子棋游戲,可以實現兩個人在用一臺機器上進行游戲。程序會自動判斷誰輸誰贏,在游戲的開始,第一個人可以選擇執白棋還是黑棋,之后點擊開始進行游戲。</p><p><b>  2.3 開發環境</b></p><p>  硬件要求能運行Eclipse的windows xp以上系統。JAVA程序設

17、計語言及相應的集成開發環境,SDK和ECLIPSE開發工具。</p><p><b>  2.4概念設計</b></p><p>  網絡五子棋是采用網絡協議為TCP/IP的網上對弈游戲,運用“客戶端-服務器“(c/s)網絡架構模式。實現用戶通過Internt連接在任何地方與不同玩家進行對戰。服務器可以創建任意多局游戲。</p><p>  通

18、過使用多線程和網絡套接字SOCKET來實現游戲之間的通訊,它是基于點對點的通訊。開始讓服務器初始化建立服務器套接字SOCKET,基于某個端口PORT,服務器始終處于監聽狀態??蛻舳耸莿幼鞯陌l起者,何時發出申請由客戶端決定??蛻舳讼蚍掌靼l出申請,服務器給予響應。打開客戶端套接字SOCKET,連接到服務器端的地址ADDRESS和端口PORT。連接建立后,創建一個SOCKET實例,并開始一個線程,監聽該客戶端請求。服務器繼續監聽其它用戶的連

19、接。服務器通過數據輸入流從客戶端接收信息,并且通過數據輸出流把相應的信息發送給客戶端??蛻舳税l送請求和響應接收到的各種信息。</p><p>  在服務器和客戶端之間傳遞的消息格式是采用“[消息類別]+內容“組成的,服務器和客戶端在傳遞消息的過程,根據消息的類別來進行相關的操作。</p><p><b>  3 系統總體設計</b></p><p&

20、gt;  3.1 系統的功能模塊示意圖</p><p><b>  3.2 系統流程圖</b></p><p><b>  4系統詳細設計</b></p><p>  4.1 代碼實現情況</p><p>  4.1.1 server 包 chessServer類</p><p&

21、gt;  class MessageServerPanel extends Panel //主消息窗口</p><p>  class ServerThread extends Thread //服務器線程,主要用于服務器與客戶端的通信</p><p>  public class chessServer extends Frame implements ActionListener

22、 //服務器端框架類</p><p>  4.1.2 client包 chessClient類</p><p>  public class chessClient extends Frame implements ActionListener, KeyListener //五子棋客戶端框架,實現了動作監聽器和鍵盤監聽器</p><p>  public bool

23、ean connectServer(String serverIP, int serverPort) throws Exception //和服務器建立連接并通信的函數。return true 連接成功, false 如果失敗.</p><p>  4.1.3 chessface 包 chatPad類</p><p>  public class chatPad extends Pan

24、el //聊天信息Panel。Panel上的文本域可以顯示用戶聊天信息。</p><p>  4.1.4 chessface 包 chessPad類</p><p>  public class chessPad extends Panel implements MouseListener //顯示棋盤的Panel。此Panel實現了鼠標監聽器</p><p&g

25、t;  class chessPoint_black extends Canvas //表示黑子的類</p><p>  class chessPoint_white extends Canvas //表示白子的類</p><p>  4.1.5 chessface包chessthread類</p><p>  public class chessThre

26、ad extends Thread //一個客戶端用戶線程. 處理用戶落子的點擊事件處理,及消息發送.</p><p>  4.1.6 chessface 包 controlpad類</p><p>  public class controlPad extends Panel //控制Panel。此Panel上的按鈕如其名,完成相應的功能。</p><p&g

27、t;  4.1.7 chessface 包 inputpad類</p><p>  public class inputPad extends Panel //輸入信息Panel。Panel左邊的下拉列表中列出了所有用戶的名字。右邊的文本框可以輸入聊天信息,點擊回車信息被發送。</p><p>  4.1.8 chessface 包userPad 類</p><p

28、>  public class userPad extends Panel //用戶列表Panel。此Panel維護一個服務器的當前用戶列表, 所有的用戶名都將顯示在列表中。</p><p><b>  4.2 測試分析</b></p><p>  4.2.1程序運行情況</p><p><b>  //打開服務端<

29、/b></p><p><b>  //打開客戶端</b></p><p><b>  //落子</b></p><p><b>  //判定</b></p><p>  4.2.2程序運行異常處理</p><p>  啟動游戲時,應先啟動服務端,

30、然后打開客戶端,連接服務端,建立游戲,加入游戲,然后落子。</p><p>  在啟動客戶端時,若是閃退,請先關閉服務端,然后重啟。</p><p><b>  5 小結</b></p><p>  經過為期二周的課程設計,感覺自己所學遠遠不能解決做課設時的需求。在熟悉課本和上網搜索后,才算馬馬虎虎的完成了任務。 在畫棋盤時,調用draw方法

31、對于畫圖這塊的坐標布置,在今后學畫其他圖畫時能夠得心應手。獲取棋子方法的巧妙,注冊鼠標,獲取點擊位置,除以棋盤間隔,去掉不為整數的一塊,再乘以棋盤間隔便獲得最臨近點的下棋坐標,即所要下棋的位置。用二維數組模擬棋盤,無棋子的置為0,黑子置為1,白子置為2,以便在判斷勝負時利于同色棋子的查找。整個棋盤就模擬出來了,很巧妙,不過有更好的方法用向量存儲棋子信息,便于悔棋等操作。 實現多用戶聊天,老師后面講的不是很多,做起來有點費力。參考網上資

32、料,明白Socket原理。開始時照著課本上的例子,不能得出想要的效果,而且只運行了一個程序看不到有通信的效果。后面在運行了Server類后,自己嘗試著兩個Client類,實現了通話,就像騰訊QQ里面一樣的效果。里面定義了Vector 線程,實現了多線程用法。 兩個板塊大體實現,但是后面的要求五,由于數據庫的使用不是太熟悉,不能注冊用戶,添加好友,查找好友,還有悔棋操作未能實現。此程序最大的缺點還在于,不能實現</p>&

33、lt;p><b>  參考文獻</b></p><p>  孫衛琴 Java面向對象教程 電子工業出版社 2006-03 </p><p>  2.孫衛琴 Java網絡編程精解 電子工業出版社 2006-03 </p><p>  3.張仕斌 Java程序設計與應用 清華大學出版社 2005-06 </p>

34、<p>  4.張孝祥 Java就業培訓程序 清華大學出版社 2003-06 </p><p>  5.耿祥義 Java課程設計 清華大學出版社 2004-03 </p><p>  6.王路群 Java高級程序設計 中國水利水電出版社 2006-03 </p><p>  7.丁振凡 Java語言使用教程 北京郵電大學出版社 200

35、5-06 </p><p>  8.薛為民 Java應用教程 清華大學出版社 2005-06 </p><p>  9.鐘允中 JAVA入門 遼寧科學技術出版社 1997-03 </p><p>  10.鄭莉 Java語言程序設計 清華大學出版社 2006-03</p><p><b>  附 源碼</b&

36、gt;</p><p>  1、server包中chessServer類:</p><p>  package server;</p><p>  import java.io.*;</p><p>  import java.net.*;</p><p>  import java.awt.*;</p>

37、<p>  import java.util.*;</p><p>  import java.awt.event.*;</p><p><b>  /**</b></p><p>  * 顯示服務器及用戶信息的Panel類</p><p><b>  */</b></p>

38、<p>  class MessageServerPanel extends Panel {</p><p><b>  // 主消息窗口</b></p><p>  TextArea messageBoard = new TextArea("", 22, 50, TextArea.SCROLLBARS_VERTICAL_ONLY);&

39、lt;/p><p>  Label statusLabel = new Label("當前連接數:", Label.LEFT);</p><p>  Panel boardPanel = new Panel();// 主顯示區Panel</p><p>  Panel statusPanel = new Panel();// 連接狀態Panel<

40、;/p><p>  MessageServerPanel() {</p><p>  setSize(350, 300);</p><p>  setBackground(new Color(204, 204, 204));</p><p>  setLayout(new BorderLayout());</p><p>

41、  boardPanel.setLayout(new FlowLayout());</p><p>  boardPanel.setSize(210, 210);</p><p>  statusPanel.setLayout(new BorderLayout());</p><p>  statusPanel.setSize(210, 50);</p>

42、<p>  boardPanel.add(messageBoard);</p><p>  statusPanel.add(statusLabel, BorderLayout.WEST);</p><p>  add(boardPanel, BorderLayout.CENTER);</p><p>  add(statusPanel, BorderL

43、ayout.NORTH);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 服務器線程,主要用于服務器與客戶端的通信</p><p><b> 

44、 */</b></p><p>  class ServerThread extends Thread {</p><p>  Socket clientSocket;</p><p>  Hashtable clientDataHash;// Socket與發送數據的流的映射</p><p>  Hashtable client

45、NameHash;// Socket與用戶名的映射</p><p>  Hashtable chessPeerHash;// 對弈的兩個客戶端用戶名的映射</p><p>  MessageServerPanel server;</p><p>  boolean isClientClosed = false;</p><p><b&g

46、t;  /**</b></p><p>  * 服務器端線程的構造函數,用于初始化一些對象。</p><p><b>  */</b></p><p>  ServerThread(Socket clientSocket, Hashtable clientDataHash, Hashtable clientNameHash, Has

47、htable chessPeerHash,</p><p>  MessageServerPanel server) {</p><p>  this.clientSocket = clientSocket;</p><p>  this.clientDataHash = clientDataHash;</p><p>  this.clie

48、ntNameHash = clientNameHash;</p><p>  this.chessPeerHash = chessPeerHash;</p><p>  this.server = server;</p><p><b>  }</b></p><p><b>  /**</b>&l

49、t;/p><p>  * 對客戶端發來的消息處理的函數,處理后轉發回客戶端。處理消息的過程比較復雜, 要針對很多種情況分別處理。</p><p><b>  */</b></p><p>  public void messageTransfer(String message) {</p><p>  String clie

50、ntName, peerName;</p><p>  /////////////命令處理///////////////////////////////</p><p>  // 如果消息以“/”開頭,表明是命令消息。</p><p>  if (message.startsWith("/")) {</p><p>  /

51、/ 如果消息以“/list”開頭,則將其回饋到客戶端以更新用戶列表</p><p>  if (message.equals("/list")) {</p><p>  Feedback(getUserList());</p><p><b>  }</b></p><p>  // 如果消息以&qu

52、ot;/creatgame [inchess]"開頭,則修改clientNameHash映射</p><p>  // 和chessPeerHash映射。</p><p>  else if (message.startsWith("/creatgame [inchess]")) {</p><p><b>  //</

53、b></p><p>  String chessServerName = message.substring(20);</p><p>  synchronized (clientNameHash) {</p><p>  clientNameHash.put(clientSocket, message.substring(11));</p>

54、<p><b>  }</b></p><p>  synchronized (chessPeerHash) {//剛創建,等待其他人加入</p><p>  chessPeerHash.put(chessServerName, "wait");</p><p><b>  }</b><

55、/p><p>  Feedback("/yourname " + clientNameHash.get(clientSocket));</p><p>  chessPeerTalk(chessServerName, "/OK");</p><p>  publicTalk(getUserList());</p>&

56、lt;p><b>  }</b></p><p>  // 如果消息以“/joingame”開頭,則將消息的服務端名字和本地用戶名提取出來,</p><p>  // 然后修改clientNameHash表和chessPeerHash表。</p><p>  if (message.startsWith("/joingame &

57、quot;)) {</p><p>  StringTokenizer userToken = new StringTokenizer(message, " ");</p><p>  String getUserToken, serverName, selfName;</p><p>  String[] chessNameOpt = {&qu

58、ot;0", "0"};</p><p>  int getOptNum = 0;</p><p>  // 提取服務端用戶名和本地用戶名</p><p>  while (userToken.hasMoreTokens()) {</p><p>  getUserToken = (String) userTok

59、en.nextToken(" ");</p><p>  if (getOptNum >= 1 && getOptNum <= 2) {</p><p>  chessNameOpt[getOptNum - 1] = getUserToken;</p><p><b>  }</b></p&

60、gt;<p>  getOptNum++;</p><p><b>  }</b></p><p>  serverName = chessNameOpt[0];</p><p>  selfName = chessNameOpt[1];</p><p>  // 如果有服務端在等待開始棋局</p&g

61、t;<p>  if (chessPeerHash.containsKey(serverName) && chessPeerHash.get(serverName).equals("wait")) {</p><p>  // 修改Socket和名字映射</p><p>  synchronized (clientNameHash) {&l

62、t;/p><p>  clientNameHash.put(clientSocket, ("[inchess]" + selfName));</p><p><b>  }</b></p><p>  // 修改chessPeerHash映射</p><p>  synchronized (chessPe

63、erHash) {</p><p>  chessPeerHash.put(serverName, selfName);</p><p><b>  }</b></p><p>  publicTalk(getUserList());</p><p>  chessPeerTalk(selfName, ("/p

64、eer " + "[inchess]" + serverName));</p><p>  chessPeerTalk(serverName, ("/peer " + "[inchess]" + selfName));</p><p><b>  } else {</b></p>&l

65、t;p>  chessPeerTalk(selfName, "/reject");</p><p><b>  try {</b></p><p>  clientClose();</p><p>  } catch (Exception ez) {</p><p><b>  }&l

66、t;/b></p><p><b>  }</b></p><p><b>  }</b></p><p>  // 如果消息以“/[inchess]”開頭,則獲取要發送消息的用戶名和發送的消息</p><p>  // 然后發送出去。</p><p>  else i

67、f (message.startsWith("/[inchess]")) {</p><p>  int firstLocation = 0, lastLocation;</p><p>  lastLocation = message.indexOf(" ", 0);</p><p>  peerName = message

68、.substring((firstLocation + 1), lastLocation);</p><p>  message = message.substring((lastLocation + 1));</p><p>  if (chessPeerTalk(peerName, message)) {</p><p>  Feedback("/er

69、ror");</p><p><b>  }</b></p><p><b>  }</b></p><p>  // 如果消息以“/giveup”開頭,則判斷是對弈雙方哪方放棄了。</p><p>  else if (message.startsWith("/giveup &

70、quot;)) {</p><p>  String chessClientName = message.substring(8);</p><p>  if (chessPeerHash.containsKey(chessClientName)</p><p>  && !((String) chessPeerHash.get(chessClien

71、tName)).equals("wait")) {</p><p>  // 如果服務方放棄,則發送消息“/youwin”表明對方獲勝</p><p>  chessPeerTalk((String) chessPeerHash.get(chessClientName), "/youwin");</p><p>  //剔除這

72、對對弈的人。。</p><p>  synchronized (chessPeerHash) {</p><p>  chessPeerHash.remove(chessClientName);</p><p><b>  }</b></p><p><b>  }</b></p>&

73、lt;p>  if (chessPeerHash.containsValue(chessClientName)) {</p><p>  // 如果客戶方放棄,也發送消息“/youwin”表明對方獲勝</p><p>  chessPeerTalk((String) getHashKey(chessPeerHash, chessClientName), "/youwin&q

74、uot;);</p><p>  synchronized (chessPeerHash) {</p><p>  chessPeerHash.remove((String) getHashKey(chessPeerHash, chessClientName));</p><p><b>  }</b></p><p>

75、<b>  }</b></p><p><b>  }</b></p><p>  // 如果找不到發送消息的用戶,則輸出消息說“沒有這個用戶”</p><p><b>  else {</b></p><p>  int firstLocation = 0, lastLoca

76、tion;</p><p>  lastLocation = message.indexOf(" ", 0);</p><p>  if (lastLocation == -1) {</p><p>  Feedback("無效命令");</p><p><b>  return;</b

77、></p><p><b>  } else {</b></p><p>  peerName = message.substring((firstLocation + 1), lastLocation);</p><p>  message = message.substring((lastLocation + 1));</p&g

78、t;<p>  message = (String) clientNameHash.get(clientSocket) + ">" + message;</p><p>  if (peerTalk(peerName, message)) {</p><p>  Feedback("沒有這個用戶:" + peerName + &q

79、uot;\n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  // ////////

80、//////////////////////////////////////</p><p>  // 如果不以“/”開頭,表明是普通消息,直接發送</p><p><b>  else {</b></p><p>  message = clientNameHash.get(clientSocket) + ">" +

81、 message;</p><p>  server.messageBoard.append(message + "\n");</p><p>  publicTalk(message);</p><p>  server.messageBoard.setCaretPosition(server.messageBoard.getText().le

82、ngth());</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 發送公共消息的函數,將消息向每個客戶端都發送一份</p><p><b>  

83、*/</b></p><p>  public void publicTalk(String publicTalkMessage) {</p><p>  synchronized (clientDataHash) {</p><p>  //枚舉遍歷所有客戶端輸出流。。</p><p>  for (Enumeration en

84、u = clientDataHash.elements(); enu.hasMoreElements();) {</p><p>  DataOutputStream outData = (DataOutputStream) enu.nextElement();</p><p><b>  try {</b></p><p>  //輸出信息。

85、。這里會阻塞</p><p>  outData.writeUTF(publicTalkMessage);</p><p>  } catch (IOException es) {</p><p>  //打印異常堆棧。。。終止程序。。</p><p>  es.printStackTrace();</p><p>&

86、lt;b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  /**</b></p><p>  *

87、選擇對象發送消息,參數peerTalk為發送的用戶名,后面的參數為發送的消息</p><p><b>  */</b></p><p>  public boolean peerTalk(String peerTalk, String talkMessage) {</p><p><b>  //</b></p>

88、;<p>  for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) {</p><p>  Socket userClient = (Socket) enu.nextElement();</p><p>  // 找到發送消息的對象,獲取它的輸出流以發送消息</p><p

89、>  if (peerTalk.equals((String) clientNameHash.get(userClient))</p><p>  && !peerTalk.equals((String) clientNameHash.get(clientSocket))) {</p><p>  synchronized (clientDataHash) {<

90、/p><p>  DataOutputStream peerOutData = (DataOutputStream) clientDataHash.get(userClient);</p><p><b>  try {</b></p><p>  peerOutData.writeUTF(talkMessage);</p><

91、p>  } catch (IOException es) {</p><p>  es.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p>  Feedback(talkMessage);</p>

92、<p>  return (false);</p><p><b>  }</b></p><p>  // 如果是發給自己的,直接回饋</p><p>  else if (peerTalk.equals((String) clientNameHash.get(clientSocket))) {</p><p&g

93、t;  Feedback(talkMessage);</p><p>  return (false);</p><p><b>  }</b></p><p><b>  }</b></p><p>  return (true);</p><p><b>  }

94、</b></p><p><b>  /**</b></p><p>  * 此函數也用于選擇發送消息,但不能發送給自己。</p><p><b>  */</b></p><p>  public boolean chessPeerTalk(String chessPeerTalk,

95、String chessTalkMessage) {</p><p>  for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) {</p><p>  Socket userClient = (Socket) enu.nextElement();</p><p>  if (che

96、ssPeerTalk.equals((String) clientNameHash.get(userClient))</p><p>  && !chessPeerTalk.equals((String) clientNameHash.get(clientSocket))) {</p><p>  synchronized (clientDataHash) {</p&

97、gt;<p>  DataOutputStream peerOutData = (DataOutputStream) clientDataHash.get(userClient);</p><p><b>  try {</b></p><p>  peerOutData.writeUTF(chessTalkMessage);</p>&l

98、t;p>  } catch (IOException es) {</p><p>  es.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p>  return (false);</p><p

99、><b>  }</b></p><p><b>  }</b></p><p>  return (true);</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 用

100、于處理消息回饋的函數</p><p><b>  */</b></p><p>  public void Feedback(String feedbackString) {</p><p>  synchronized (clientDataHash) {</p><p>  //得到輸出流。。。</p>

101、<p>  DataOutputStream outData = (DataOutputStream) clientDataHash.get(clientSocket);</p><p><b>  try {</b></p><p><b>  //輸出信息。。。</b></p><p>  outData.

102、writeUTF(feedbackString);</p><p>  } catch (Exception eb) {</p><p>  //打印堆棧軌跡,程序終止。。</p><p>  eb.printStackTrace();</p><p><b>  }</b></p><p>&l

103、t;b>  }</b></p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 獲取用戶列表的函數,此函數讀取clientNameHash獲取用戶列表, 然后將其保存在一個字符串userList中。</p><p><b&g

104、t;  */</b></p><p>  public String getUserList() {</p><p>  String userList = "/userlist";</p><p>  //遍歷hashtable中的values,以空格分割連接起來</p><p>  for (Enumera

105、tion enu = clientNameHash.elements(); enu.hasMoreElements();) {</p><p>  userList = userList + " " + (String) enu.nextElement();</p><p><b>  }</b></p><p>  ret

106、urn userList;</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 給出HashTable和值對象,獲取相對應得鍵值的函數。</p><p><b>  */</b></p><p> 

107、 public Object getHashKey(Hashtable targetHash, Object hashValue) {</p><p>  Object hashKey;</p><p>  for (Enumeration enu = targetHash.keys(); enu.hasMoreElements();) {</p><p>  ha

108、shKey = (Object) enu.nextElement();</p><p>  //如果鍵對應的值與hashValue相等,則返回這個key</p><p>  if (hashValue.equals((Object) targetHash.get(hashKey)))</p><p>  return (hashKey);</p>&l

109、t;p><b>  }</b></p><p>  return (null);</p><p><b>  }</b></p><p>  public void firstCome() {</p><p>  //新用戶第一次加入、廣播用戶列表。。</p><p>

110、  publicTalk(getUserList());</p><p>  //反饋給這個用戶,以修改相應顯示信息。。</p><p>  Feedback("/yourname " + (String) clientNameHash.get(clientSocket));</p><p>  Feedback("Java五子棋聊天客

111、戶端");</p><p>  Feedback("/changename <你的名字> --更改名字");</p><p>  Feedback("/list --更新用戶列表");</p><p>  Feedback("/<用戶名> <要說的話> --私聊"

112、;);</p><p>  Feedback("注意:用命令的時候,先把談話的對象定為所有人");</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 用于和客戶端斷開的函數。</p><p><

113、;b>  */</b></p><p>  public void clientClose() {</p><p>  server.messageBoard.append("用戶斷開:" + clientSocket + "\n");</p><p>  // 如果是游戲客戶端主機</p>&

114、lt;p>  synchronized (chessPeerHash) {</p><p>  if (chessPeerHash.containsKey(clientNameHash.get(clientSocket))) {</p><p>  chessPeerHash.remove((String) clientNameHash.get(clientSocket));<

115、/p><p><b>  }</b></p><p>  if (chessPeerHash.containsValue(clientNameHash.get(clientSocket))) {</p><p>  chessPeerHash.put((String) getHashKey(chessPeerHash, (String) clien

116、tNameHash.get(clientSocket)),</p><p>  "tobeclosed");</p><p><b>  }</b></p><p><b>  }</b></p><p>  // 將保留的HashTable里的數據清除</p>&

117、lt;p>  synchronized (clientDataHash) {</p><p>  clientDataHash.remove(clientSocket);</p><p><b>  }</b></p><p>  synchronized (clientNameHash) {</p><p>  

118、clientNameHash.remove(clientSocket);</p><p><b>  }</b></p><p>  //廣播更新用戶列表。。。</p><p>  publicTalk(getUserList());</p><p>  // 計算當前連接數,并顯示在狀態框中</p>&l

119、t;p>  server.statusLabel.setText("當前連接數:" + clientDataHash.size());</p><p><b>  try {</b></p><p>  clientSocket.close();</p><p>  } catch (IOException exx)

120、{</p><p><b>  }</b></p><p>  isClientClosed = true;</p><p><b>  }</b></p><p>  public void run() {</p><p>  DataInputStream inData;

121、</p><p>  synchronized (clientDataHash) {</p><p>  server.statusLabel.setText("當前連接數:" + clientDataHash.size());</p><p><b>  }</b></p><p><b>

122、;  try {</b></p><p>  inData = new DataInputStream(clientSocket.getInputStream());</p><p>  firstCome();</p><p>  while (true) {</p><p>  String message = inData.

123、readUTF();</p><p>  messageTransfer(message);</p><p><b>  }</b></p><p>  } catch (IOException esx) {</p><p>  } finally {</p><p>  if (!isClien

124、tClosed) {</p><p>  clientClose();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>&

125、lt;/p><p><b>  /**</b></p><p>  * @author wufenghanren 服務器端框架類</p><p><b>  */</b></p><p>  public class chessServer extends Frame implements Action

126、Listener {</p><p>  Button messageClearButton = new Button("清除顯示");</p><p>  Button serverStatusButton = new Button("服務器狀態");</p><p>  Button serverOffButton = n

127、ew Button("關閉服務器");</p><p>  Panel buttonPanel = new Panel();</p><p>  MessageServerPanel server = new MessageServerPanel();</p><p>  ServerSocket serverSocket;</p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論