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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p>  操作系統(tǒng)課程設(shè)計報告</p><p><b>  目錄</b></p><p>  一. 設(shè)計要求和目的………………………………………3</p><p>  二. 背景知識…………………………………………………………4</p><p>  三. 客戶端設(shè)計………………………………………………………5

2、</p><p>  四. 客戶端主要代碼…………………………………………………6</p><p>  五. 設(shè)計體會…………………………………………………………9</p><p><b>  摘要</b></p><p>  隨著網(wǎng)絡(luò)信息時代的來臨,Internet應(yīng)用越來越廣泛人們越來越習(xí)慣于在網(wǎng)上獲取和交流信息。

3、據(jù)調(diào)查顯示,80%以上的人上網(wǎng)都會打開聊天工具來聊天,而幾乎每一個年輕人都會去聊天。使用網(wǎng)上聊天已經(jīng)成為現(xiàn)代年輕人一種新的交往方式。聊天室更適合于陌生人之間進行較為主觀、感興化的討論。所以有大部分的人會進入聊天室聊天它會給人一個完全自由的聊天世界。因此我們聯(lián)系所學(xué)的操作系統(tǒng)、數(shù)據(jù)庫和MFC知識決定做一個簡易的聊天系統(tǒng)。</p><p><b>  設(shè)計要求和目的</b></p>

4、<p>  此課題是實現(xiàn)一個即時通信系統(tǒng)完成 1:進程間通信、并發(fā)(同步/互斥)、文件讀寫</p><p>  2:內(nèi)存管理、Dll、Windows消息機制、IO。</p><p><b>  課題任務(wù)分工:</b></p><p><b>  客戶端子系統(tǒng):</b></p><p>

5、  在客戶端系統(tǒng)的功能實現(xiàn)上,可以分為以下幾個部分:</p><p>  [1]進程信息的輸入</p><p>  系統(tǒng)把用戶進程要求發(fā)送的信息由鍵盤輸入從文件讀取。這部分功能是客戶端子系統(tǒng)的基本部分,這個功能是以后各個部分的基礎(chǔ)。系統(tǒng)要求做到即能夠從其它子系</p><p><b>  統(tǒng)中共享一部分信息</b></p><

6、;p>  [2]進程信息的存儲: 將進程的信息存儲到客戶端系統(tǒng)中,以及將發(fā)送的信息保存在文件中,以備以后進程之間通信確認以及查詢。</p><p>  [3]通信數(shù)據(jù)的傳遞及接收: 將客戶所發(fā)送的信息由客戶端由網(wǎng)絡(luò)傳到服務(wù)器端上,并且接受航服務(wù)器返回的接收方發(fā)送的信息,然后存儲起來。</p><p><b>  背景知識</b></p&

7、gt;<p><b>  SOCKET</b></p><p>  Socket可以看成在兩個程序進行通訊連接中的一個端點,是連接應(yīng)用程序和網(wǎng)絡(luò)驅(qū)動程序的橋梁,Socket在應(yīng)用程序中創(chuàng)建,通過綁定與網(wǎng)絡(luò)驅(qū)動建立關(guān)系。此后,應(yīng)用程序送給Socket的數(shù)據(jù),由Socket交網(wǎng)絡(luò)驅(qū)動程序向網(wǎng)絡(luò)上發(fā)送出去。計算機從網(wǎng)絡(luò)上收到與該Socket綁定IP地址和端口號相關(guān)的數(shù)據(jù)后,由網(wǎng)絡(luò)驅(qū)動

8、程序交給Socket,應(yīng)用程序便可從該Socket中提取接收到得數(shù)據(jù),網(wǎng)絡(luò)應(yīng)用程序就是這樣通過Socket進行數(shù)據(jù)的發(fā)送與接收的</p><p>  (1) 創(chuàng)建Socket;</p><p>  (2) 打開連接到Socket的輸入/出流;</p><p> ?。?) 按照一定的協(xié)議對Socket進行讀/寫操作;</p><p> ?。?)

9、 關(guān)閉Socket.</p><p><b>  IO技術(shù)</b></p><p><b>  阻塞模式</b></p><p>  可能造成阻塞的函數(shù)有:connect()、accept()、讀寫函數(shù)</p><p>  C/S兩端通過Socket機制進行連接(1) 客戶端的編程流程:

10、a創(chuàng)建Socket對象,向Server的監(jiān)聽端口請求; b通過向新Socket中讀寫數(shù)據(jù)與Server端通信; c關(guān)閉Socket,結(jié)束與Server端;</p><p>  (2)服務(wù)器端的編程流程: 1打開Server Socket,創(chuàng)建一個服務(wù)器型套接字和一個普通套接字,服務(wù)器型套接字在指 </p><p>  定端口為客戶端請求的Soc

11、ket 服務(wù); 2 等待來自客戶端的Client端的請求;</p><p>  3接收Client端的請求,用返回的Socket建立連接; 4通過向Socket中讀寫數(shù)據(jù)來與Client端通信; 5關(guān)閉Socket,結(jié)束與當(dāng)前Client端的通信;</p><p>  6關(guān)閉SerketSocket對象結(jié)束監(jiān)聽服務(wù)。</p><p><b&

12、gt;  客戶端設(shè)計</b></p><p>  客戶端主要完成建立連接、消息輸入、消息發(fā)送、消息存儲功能。</p><p><b>  功能含義如下:</b></p><p>  建立連接:建立一個ServerSocket連接,不斷偵聽是否有服務(wù)端連接或者斷開連接。</p><p>  消息輸入:根據(jù)用戶輸

13、入的消息,將消息顯示在屏幕面板上。</p><p>  消息發(fā)送:把用戶輸入的消息作為字符串通過Socket端口發(fā)送到服務(wù)器。</p><p>  消息存儲:把用戶輸入的消息存儲到data.txt文件中,以便用戶以后查閱聊天記錄。</p><p><b>  客戶端設(shè)計如下:</b></p><p><b> 

14、 界面設(shè)計</b></p><p><b>  連接設(shè)計</b></p><p><b>  接收信息設(shè)計</b></p><p><b>  用戶信息設(shè)計</b></p><p><b>  幫助設(shè)計</b></p><p

15、>  客戶端用戶設(shè)計的IP地址和端口號連接到相應(yīng)的服務(wù)器,通過接收用戶輸入的消息,然后通過所監(jiān)聽的端口把消息發(fā)送到服務(wù)端,由服務(wù)端把消息發(fā)送到指定的用戶</p><p><b>  用戶連接服務(wù)器</b></p><p><b>  1客戶端請求連接</b></p><p>  客戶端通過connect()請求連接,

16、填寫端口號以及IP地址,填寫自己的信息。</p><p><b>  2服務(wù)器端響應(yīng)</b></p><p>  服務(wù)器端的監(jiān)聽器監(jiān)聽到客戶端的連接請求后,檢測后允許客戶端連接到服務(wù)器。</p><p><b>  3給客戶端返回信息</b></p><p>  連接成功后服務(wù)器返回給客戶端連接成功

17、的信息,并且給所有的用戶發(fā)送用戶登錄信息。</p><p>  4關(guān)閉Socket連接</p><p>  當(dāng)以上的程序都正常運行后,需要關(guān)閉Socket連接,否則將會浪費服務(wù)器與客戶端之間的資源。</p><p><b>  5用戶退出</b></p><p><b>  5.1接收退出信息</b>

18、;</p><p>  當(dāng)用戶退出時,客戶端將會用基于Socket的對象輸出流發(fā)送給服務(wù)器退出對象。</p><p>  5.2在線列表中刪除用戶</p><p>  用戶退出后應(yīng)該把用戶從在線列表中刪除,否則用戶退出用戶還在在線列表中,那么該用戶下次將會無法登錄。</p><p><b>  5.3更新在線列表</b>

19、</p><p>  用戶退出后將服務(wù)器端監(jiān)控界面的用戶列表更新。否則用戶數(shù)據(jù)將會不同步。</p><p><b>  客戶端主要代碼</b></p><p><b>  /**</b></p><p><b>  * 事件處理</b></p><p>

20、<b>  */</b></p><p>  public void actionPerformed(ActionEvent e) {</p><p>  Object obj = e.getSource();</p><p>  if (obj == userItem || obj == userButton) { //用戶信息設(shè)置</

21、p><p>  //調(diào)出用戶信息設(shè)置對話框</p><p>  UserConf userConf = new UserConf(this,userName);</p><p>  userConf.setVisible(true);</p><p>  userName = userConf.userInputName;</p>

22、<p><b>  }</b></p><p>  else if (obj == connectItem || obj == connectButton) { //連接服務(wù)端設(shè)置</p><p>  //調(diào)出連接設(shè)置對話框</p><p>  ConnectConf conConf = new ConnectConf(this,ip

23、,port);</p><p>  conConf.setVisible(true);</p><p>  ip = conConf.userInputIp;</p><p>  port = conConf.userInputPort;</p><p><b>  }</b></p><p> 

24、 else if (obj == loginItem || obj == loginButton) { //登錄</p><p>  Connect();</p><p><b>  }</b></p><p>  else if (obj == logoffItem || obj == logoffButton) { //注銷</p&g

25、t;<p>  DisConnect();</p><p>  showStatus.setText("");</p><p><b>  }</b></p><p>  else if(obj == dataItem){</p><p><b>  try{</b>

26、;</p><p>  File read=new File("data.txt");</p><p>  Desktop.getDesktop().open(read);</p><p>  }catch (IOException e1){</p><p>  e1.printStackTrace();</p>

27、;<p><b>  }</b></p><p><b>  }</b></p><p>  else if (obj == clientMessage || obj == clientMessageButton) { //發(fā)送消息</p><p>  SendMessage();</p>&l

28、t;p>  clientMessage.setText("");</p><p><b>  }</b></p><p>  else if (obj == exitButton || obj == exitItem) { //退出</p><p>  int j=JOptionPane.showConfirmDial

29、og(</p><p>  this,"真的要退出嗎?","退出",</p><p>  JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);</p><p>  if (j == JOptionPane.YES_OPTION){</p><p> 

30、 if(type == 1){</p><p>  DisConnect();</p><p><b>  }</b></p><p>  System.exit(0);</p><p><b>  }</b></p><p><b>  }</b>&l

31、t;/p><p>  else if (obj == helpItem) { //菜單欄中的幫助</p><p><b>  //調(diào)出幫助對話框</b></p><p>  Help helpDialog = new Help(this);</p><p>  helpDialog.setVisible(true);<

32、/p><p><b>  }</b></p><p><b>  }</b></p><p>  public void run(){</p><p>  while(!socket.isClosed()){</p><p><b>  try{</b>&l

33、t;/p><p>  String type = (String)input.readObject();</p><p>  if(type.equalsIgnoreCase("系統(tǒng)信息")){</p><p>  String sysmsg = (String)input.readObject();</p><p>  Si

34、mpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); </p><p>  String ly_time = sdf.format(new Date());</p><p>  textarea.append(ly_time);</p><p>  textarea.a

35、ppend("\n");</p><p>  textarea.append("系統(tǒng)信息: "+sysmsg);</p><p><b>  }</b></p><p>  else if(type.equalsIgnoreCase("服務(wù)關(guān)閉")){</p><p

36、>  output.close();</p><p>  input.close();</p><p>  socket.close();</p><p>  textarea.append("服務(wù)器已關(guān)閉!\n");</p><p><b>  break;</b></p>&l

37、t;p><b>  }</b></p><p>  else if(type.equalsIgnoreCase("聊天信息")){</p><p>  String message = (String)input.readObject();</p><p>  SimpleDateFormat sdf = new Si

38、mpleDateFormat("yyyy-MM-dd HH:mm:ss"); </p><p>  String ly_time = sdf.format(new Date());</p><p>  textarea.append(ly_time);</p><p>  textarea.append("\n");</

39、p><p>  textarea.append(message);</p><p><b>  try{</b></p><p>  record=new BufferedWriter(new FileWriter("data.txt",true));</p><p>  record.write(ly_

40、time);</p><p>  record.newLine();</p><p>  record.write(message);</p><p>  record.newLine();</p><p>  record.close();</p><p>  }catch (IOException e){</

41、p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(type.equalsIgnoreCase("用戶列表")){</p><p>  S

42、tring userlist = (String)input.readObject();</p><p>  String usernames[] = userlist.split("\n");</p><p>  combobox.removeAllItems();</p><p><b>  int i =0;</b>&

43、lt;/p><p>  combobox.addItem("所有人");</p><p>  while(i < usernames.length){</p><p>  combobox.addItem(usernames[i]);</p><p><b>  i ++;</b></p>

44、;<p><b>  }</b></p><p>  combobox.setSelectedIndex(0);</p><p>  showStatus.setText("在線用戶 " + usernames.length + " 人");</p><p><b>  }<

45、/b></p><p><b>  }</b></p><p>  catch (Exception e ){</p><p>  System.out.println(e);</p><p><b>  }</b></p><p><b>  }</b

46、></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  設(shè)計體會</b></p><p>  本次課程設(shè)計歷時將近兩個月,當(dāng)老師布置課程設(shè)計題目時還覺得這個課程設(shè)計很簡單,再加上正在學(xué)Java,以及相關(guān)界面設(shè)計,當(dāng)時

47、還沒有學(xué)Socket編程,覺得只要學(xué)號Socket就行差不多了,但是在做的過程中,要寫需求分析等資料,之前也沒怎么寫過,對這方面不是很了解,所以遇到了種種困難,好多功能和邏輯都沒想到,導(dǎo)致后來寫程序的時候走了很過彎路。還有就是在學(xué)習(xí)Socket編程的時候,本來覺得不就是Java里面的一個類嗎,這還不好寫嗎,但是真的用起來,就沒有那么簡單了,不是這兒出錯就是那兒出錯,最后看了幾個例子,然后有看了好多的API函數(shù),慢慢的,也就寫的越來越順手

48、了。</p><p>  服務(wù)器端程序設(shè)計模塊: </p><p>  作為C/S模式下的系統(tǒng)開發(fā),很顯然服務(wù)器端程序的設(shè)計是非常重要的。下面就服務(wù)器端的相關(guān)程序模塊進行設(shè)計,并一定程度上實現(xiàn)了相關(guān)功能。</p><p><b>  主服務(wù)器類的設(shè)計</b></p><p>  設(shè)計服務(wù)器時需要考慮如下幾個因素:<

49、/p><p>  (1)服務(wù)器的運行速度;</p><p>  (2)服務(wù)器的響應(yīng)速度,包括新建連接和發(fā)送數(shù)據(jù)的響應(yīng)速度;</p><p>  (3)I/O吞吐量;</p><p>  (4)其他:流量控制(QoS)、安全性。</p><p>  針對TCP/IP協(xié)議的數(shù)據(jù)結(jié)構(gòu),設(shè)計服務(wù)器的程序結(jié)構(gòu)需要考慮以下的因素:&l

50、t;/p><p><b>  (1)多線程;</b></p><p><b>  (2)多進程;</b></p><p><b>  (3)單線程。</b></p><p>  主服務(wù)器類實現(xiàn)了服務(wù)器端的多線程,使用SeverSocket s=newServerSocket(808

51、0)語句在8080端口創(chuàng)建套接口;使用new ServerThread(socket)語句創(chuàng)建新的線程。主服務(wù)器類調(diào)用ServerThread類,而每個ServerThread實體就是一個獨立的線程,剛好對應(yīng)于客戶端的連接請求響應(yīng)線程。服務(wù)器端有一個(或多個)進程在指定的端口等待客戶的連接信息,一旦連接成功,就可以按設(shè)計的數(shù)據(jù)交換方法和格式進行數(shù)據(jù)傳輸。</p><p>  客戶端只在需要的時候向服務(wù)器端發(fā)出連接

52、請求。實現(xiàn)界面如圖</p><p>  服務(wù)器端完成的功能是:對服務(wù)器的某一可用端口進行監(jiān)聽,以獲得客戶端請求,從而對客戶端請求進行處理。因為是多客戶同時請求,所以要采用多線程,為每一個在線用戶分配一個線程,實時處理每個客戶端的請求。因此,</p><p>  對服務(wù)器端程序抽象如下:</p><p><b>  公共數(shù)據(jù)處理 </b><

53、/p><p>  處理公共數(shù)據(jù)。如在線人數(shù)統(tǒng)計,客戶的公共數(shù)據(jù)(如通知等),客戶數(shù)據(jù)資料的存儲與讀取等(與數(shù)據(jù)庫交互);</p><p><b>  端口監(jiān)聽器</b></p><p>  監(jiān)聽服務(wù)器某一端口,為每一在線客戶建立一個會話線程;</p><p><b>  客戶請求處理 </b></

54、p><p>  處理客戶的請求。根據(jù)客戶的請求執(zhí)行相應(yīng)的操作。</p><p><b>  服務(wù)器管理器</b></p><p>  服務(wù)器端的管理工具,如對數(shù)據(jù)進行統(tǒng)計</p><p><b>  服務(wù)器端的結(jié)構(gòu)圖:</b></p><p>  服務(wù)器實現(xiàn)所涉及的幾個主要類以

55、及各個類中主要的方法實現(xiàn):</p><p>  ChatServer.java 服務(wù)器的主框架類。</p><p>  此類實現(xiàn)接口ActionListener,用于對用戶事件的監(jiān)聽,以及對事件的處理。</p><p><b>  /**</b></p><p><b>  * 事件處理</b>&

56、lt;/p><p><b>  */</b></p><p>  public void actionPerformed(ActionEvent e)</p><p><b>  {</b></p><p>  Object obj = e.getSource();</p><p&g

57、t;  if (obj == startServer || obj == startItem)</p><p>  { // 啟動服務(wù)端</p><p>  startService();</p><p>  } else if (obj == stopServer || obj == stopItem)</p><p>  { // 停止服

58、務(wù)端</p><p>  int j = JOptionPane.showConfirmDialog(this, "真的停止服務(wù)嗎?", "停止服務(wù)",</p><p>  JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE);</p><p>  if (j == JOp

59、tionPane.YES_OPTION)</p><p><b>  {</b></p><p>  stopService();</p><p><b>  }</b></p><p>  } else if (obj == portSet || obj == portItem)</p>

60、;<p><b>  { // 端口設(shè)置</b></p><p>  // 調(diào)出端口設(shè)置的對話框</p><p>  PortConf portConf = new PortConf(this);</p><p>  portConf.setVisible(true);</p><p>  } else i

61、f (obj == exitButton || obj == exitItem)</p><p><b>  { // 退出程序</b></p><p>  int j = JOptionPane.showConfirmDialog(this, "真的要退出嗎?", "退出",</p><p>  JOp

62、tionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE);</p><p>  if (j == JOptionPane.YES_OPTION)</p><p><b>  {</b></p><p>  stopService();</p><p>  System.exit

63、(0);</p><p><b>  }</b></p><p>  } else if (obj == helpItem)</p><p>  { // 菜單欄中的幫助</p><p>  // 調(diào)出幫助對話框</p><p>  Help helpDialog = new Help(this)

64、;</p><p>  helpDialog.setVisible(true);</p><p>  } else if (obj == sysMessage || obj == sysMessageButton)</p><p>  { // 發(fā)送系統(tǒng)消息</p><p>  sendSystemMessage();</p>

65、<p><b>  }</b></p><p><b>  } </b></p><p><b>  /**</b></p><p>  * 此函數(shù)用于啟動服務(wù)器,并在指定的端口監(jiān)聽客戶端的連接</p><p><b>  */</b><

66、/p><p>  public void startService()</p><p><b>  {</b></p><p><b>  try</b></p><p><b>  {</b></p><p>  serverSocket = new Se

67、rverSocket(port, 10);</p><p>  messageShow.append("服務(wù)端已經(jīng)啟動,在" + port + "端口偵聽...\n");</p><p>  startServer.setEnabled(false);</p><p>  startItem.setEnabled(false)

68、;</p><p>  portSet.setEnabled(false);</p><p>  portItem.setEnabled(false);</p><p>  stopServer.setEnabled(true);</p><p>  stopItem.setEnabled(true);</p><p>

69、;  sysMessage.setEnabled(true);</p><p>  } catch (Exception e)</p><p><b>  {</b></p><p>  e.printStackTrace();</p><p><b>  }</b></p><

70、p>  userLinkList = new UserLinkList();</p><p>  listenThread = new ServerListen(serverSocket, combobox, messageShow,showStatus, userLinkList);</p><p>  listenThread.start();</p><p&

71、gt;<b>  }</b></p><p><b>  /**</b></p><p>  * 此函數(shù)用于關(guān)閉服務(wù)器,關(guān)閉服務(wù)器后給所有在線用戶發(fā)送服務(wù)器關(guān)閉的信息,服 </p><p>  * 務(wù)器關(guān)閉后,所有的input,output輸入輸出流都會關(guān)閉,并且socket也會關(guān)閉。</p>&l

72、t;p>  * 所有的數(shù)據(jù)都恢復(fù)初始化</p><p><b>  */</b></p><p>  public void stopService()</p><p><b>  {</b></p><p><b>  try</b></p><p&

73、gt;<b>  {</b></p><p>  // 向所有人發(fā)送服務(wù)器關(guān)閉的消息</p><p>  sendStopToAll();</p><p>  listenThread.isStop = true;</p><p>  serverSocket.close();</p><p> 

74、 int count = userLinkList.getCount();</p><p>  int i = 0;</p><p>  while (i < count)</p><p><b>  {</b></p><p>  Node node = userLinkList.findUser(i);<

75、/p><p>  node.input.close();</p><p>  node.output.close();</p><p>  node.socket.close();</p><p><b>  i++;</b></p><p><b>  }</b></p&

76、gt;<p>  stopServer.setEnabled(false);</p><p>  stopItem.setEnabled(false);</p><p>  startServer.setEnabled(true);</p><p>  startItem.setEnabled(true);</p><p>  

77、portSet.setEnabled(true);</p><p>  portItem.setEnabled(true);</p><p>  sysMessage.setEnabled(false);</p><p>  messageShow.append("服務(wù)端已經(jīng)關(guān)閉\n");</p><p>  combob

78、ox.removeAllItems();</p><p>  combobox.addItem("所有人");</p><p>  } catch (Exception e)</p><p><b>  {</b></p><p>  e.printStackTrace();</p>&

79、lt;p><b>  }</b></p><p><b>  }</b></p><p>  ServerListen.java 服務(wù)端的偵聽類。</p><p>  此類繼承于Thread類,服務(wù)器的監(jiān)聽類,等待用戶的連接,并且給在線用戶發(fā)送上線用戶的信息提示。</p><p>  publ

80、ic void run(){</p><p>  while(!isStop && !server.isClosed()){</p><p><b>  try{</b></p><p>  client = new Node();</p><p>  client.socket = server.acc

81、ept();</p><p>  client.output = new ObjectOutputStream(client.socket.getOutputStream());</p><p>  client.output.flush();</p><p>  client.input = new ObjectInputStream(client.socket

82、.getInputStream());</p><p>  client.username = (String)client.input.readObject();</p><p><b>  //顯示提示信息</b></p><p>  combobox.addItem(client.username);</p><p&g

83、t;  userLinkList.addUser(client);</p><p>  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); </p><p>  String str = sdf.format(new Date());</p><p>  text

84、area.append(str + "\n" + "用戶 " + client.username + " 上線" + "\n");</p><p>  textfield.setText("在線用戶" + userLinkList.getCount() + "人\n");</p>

85、<p>  recvThread = new ServerReceive(textarea,textfield,</p><p>  combobox,client,userLinkList);</p><p>  recvThread.start();</p><p><b>  }</b></p><p>

86、  catch(Exception e){</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  3. ServerReceive.java服務(wù)器收發(fā)消息的類。</p><

87、;p>  此類也繼承于Thread類,主要處理客戶端發(fā)來的信息,并對信息進行必要的處理,通過input輸入流以及output輸出流把信息輸出在指定用戶的對話框中。除此之外還對用戶下線時作必要的處理,提示用戶下線,以及顯示在線人數(shù)。</p><p>  public void run(){</p><p>  //向所有人發(fā)送用戶的列表</p><p>  se

88、ndUserList();</p><p>  while(!isStop && !client.socket.isClosed()){</p><p><b>  try{</b></p><p>  String type = (String)client.input.readObject();</p><

89、;p>  if(type.equalsIgnoreCase("聊天信息")){</p><p>  String toSomebody = (String)client.input.readObject();</p><p>  String status = (String)client.input.readObject();</p><p

90、>  String action = (String)client.input.readObject();</p><p>  String message = (String)client.input.readObject();</p><p>  String msg = client.username +" "+ action+ "對 "

91、;+ toSomebody + " 說 : "+ message + "\n";</p><p>  if(status.equalsIgnoreCase("悄悄話")){</p><p>  msg = " [悄悄話] " + msg;</p><p><b>  }<

92、/b></p><p>  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); </p><p>  String str = sdf.format(new Date()); </p><p>  textarea.append(str + "\n

93、" + msg);</p><p>  if(toSomebody.equalsIgnoreCase("所有人")){</p><p>  sendToAll(msg);//向所有人發(fā)送消息</p><p><b>  }</b></p><p><b>  else{</b

94、></p><p><b>  try{</b></p><p>  client.output.writeObject("聊天信息");</p><p>  client.output.flush();</p><p>  client.output.writeObject(msg);<

95、/p><p>  client.output.flush();</p><p><b>  }</b></p><p>  catch (Exception e){</p><p>  //System.out.println("###"+e);</p><p><b>

96、  }</b></p><p>  Node node = userLinkList.findUser(toSomebody);</p><p>  if(node != null){</p><p>  node.output.writeObject("聊天信息"); </p><p>  node.outp

97、ut.flush();</p><p>  node.output.writeObject(msg);</p><p>  node.output.flush();</p><p><b>  }</b></p><p><b>  }</b></p><p><b&g

98、t;  }</b></p><p>  else if(type.equalsIgnoreCase("用戶下線")){</p><p>  Node node = userLinkList.findUser(client.username);</p><p>  userLinkList.delUser(node);</p>

99、;<p>  String msg = "用戶 " + client.username + " 下線\n";</p><p>  int count = userLinkList.getCount();</p><p>  combobox.removeAllItems();</p><p>  combobox

100、.addItem("所有人");</p><p>  int i = 0;</p><p>  while(i < count){</p><p>  node = userLinkList.findUser(i);</p><p>  if(node == null) {</p><p>&

101、lt;b>  i ++;</b></p><p><b>  continue;</b></p><p><b>  } </b></p><p>  combobox.addItem(node.username);</p><p><b>  i++;</b>

102、;</p><p><b>  }</b></p><p>  combobox.setSelectedIndex(0);</p><p>  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); </p><p>  

103、String str = sdf.format(new Date()); </p><p>  textarea.append(str + "\n" + msg);</p><p>  textfield.setText("在線用戶" + userLinkList.getCount() + "人\n");</p>&

104、lt;p>  sendToAll(msg);//向所有人發(fā)送消息</p><p>  sendUserList();//重新發(fā)送用戶列表,刷新</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b>

105、</p><p>  catch (Exception e){</p><p>  //System.out.println(e);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>&

溫馨提示

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

評論

0/150

提交評論