版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java網(wǎng)絡(luò)聊天室課程設(shè)計
- 網(wǎng)絡(luò)編程課程設(shè)計-java聊天室
- java課程設(shè)計--聊天室系統(tǒng)
- java課程設(shè)計---聊天室系統(tǒng)
- java聊天室程序(java)
- java課程設(shè)計之簡單聊天室
- tcp課程設(shè)計--網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計---網(wǎng)絡(luò)聊天室
- java課程設(shè)計---java聊天室的系統(tǒng)的設(shè)計與開發(fā)(含代碼)
- java課程設(shè)計---java聊天室的系統(tǒng)的設(shè)計與開發(fā)(含代碼)
- java課程設(shè)計報告---利用java實現(xiàn)簡單聊天室
- 聊天室畢業(yè)設(shè)計說明書
- 聊天室課程設(shè)計---聊天程序的設(shè)計和實現(xiàn)
- java網(wǎng)絡(luò)聊天室畢業(yè)課程設(shè)計報告(內(nèi)附代碼)
- 基于java網(wǎng)絡(luò)聊天室設(shè)計
- 網(wǎng)絡(luò)編程課程設(shè)計-簡單的聊天室程序設(shè)計
- 網(wǎng)絡(luò)編程課程設(shè)計-簡單的聊天室程序設(shè)計
- Java課程設(shè)計---JAVA聊天室的系統(tǒng)的設(shè)計與開發(fā)(含代碼).doc
- java聊天室設(shè)計
- java課程設(shè)計---java聊天室的系統(tǒng)的設(shè)計與開發(fā)
評論
0/150
提交評論