Java網(wǎng)絡聊天室課程設計說明書(含源程序)_第1頁
Java網(wǎng)絡聊天室課程設計說明書(含源程序)_第2頁
Java網(wǎng)絡聊天室課程設計說明書(含源程序)_第3頁
Java網(wǎng)絡聊天室課程設計說明書(含源程序)_第4頁
Java網(wǎng)絡聊天室課程設計說明書(含源程序)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、. . . . 操作系統(tǒng)課程設計報告目錄一 設計要求和目的3二 背景知識4三 客戶端設計5四 客戶端主要代碼6五 設計體會9摘要隨著網(wǎng)絡信息時代的來臨,Internet應用越來越廣泛人們越來越習慣于在網(wǎng)上獲取和交流信息。據(jù)調(diào)查顯示,80%以上的人上網(wǎng)都會打開聊天工具來聊天,而幾乎每一個年輕人都會去聊天。使用網(wǎng)上聊天已經(jīng)成為現(xiàn)代年輕人一種新的交往方式。聊天室更適合于陌生人之間進行較為主觀、感興化的討論。所以有大部分的人會進入聊天室聊天它會給人一個完全自由的聊天世界。因此我們聯(lián)系所學的操作系統(tǒng)、數(shù)據(jù)庫和MFC知識決定做一個簡易的聊天系統(tǒng)。1、 設計要求和目的此課題是實現(xiàn)一個即時通信系統(tǒng)完成 1:進

2、程間通信、并發(fā)(同步/互斥)、文件讀寫 2:存管理、Dll、Windows消息機制、IO。課題任務分工:客戶端子系統(tǒng):在客戶端系統(tǒng)的功能實現(xiàn)上,可以分為以下幾個部分: 1進程信息的輸入 系統(tǒng)把用戶進程要求發(fā)送的信息由鍵盤輸入從文件讀取。這部分功能是客戶端子系統(tǒng)的基本部分,這個功能是以后各個部分的基礎。系統(tǒng)要求做到即能夠從其它子系統(tǒng)中共享一部分信息2進程信息的存儲:將進程的信息存儲到客戶端系統(tǒng)中,以與將發(fā)送的信息保存在文件中,以備以后進程之間通信確認以與查詢。 3通信數(shù)據(jù)的傳遞與接收:將客戶所發(fā)送的信息由客戶端由網(wǎng)絡傳到服務器端上,并且接受航服務器返回的接收方發(fā)送的信息,然后存儲起來。2 背景知

3、識SOCKET Socket可以看成在兩個程序進行通訊連接中的一個端點,是連接應用程序和網(wǎng)絡驅(qū)動程序的橋梁,Socket在應用程序中創(chuàng)建,通過綁定與網(wǎng)絡驅(qū)動建立關系。此后,應用程序送給Socket的數(shù)據(jù),由Socket交網(wǎng)絡驅(qū)動程序向網(wǎng)絡上發(fā)送出去。計算機從網(wǎng)絡上收到與該Socket綁定IP地址和端口號相關的數(shù)據(jù)后,由網(wǎng)絡驅(qū)動程序交給Socket,應用程序便可從該Socket中提取接收到得數(shù)據(jù),網(wǎng)絡應用程序就是這樣通過Socket進行數(shù)據(jù)的發(fā)送與接收的(1) 創(chuàng)建Socket;(2) 打開連接到Socket的輸入/出流;(3) 按照一定的協(xié)議對Socket進行讀/寫操作;(4) 關閉Socke

4、t. IO技術 阻塞模式 可能造成阻塞的函數(shù)有:connect()、accept()、讀寫函數(shù)C/S兩端通過Socket機制進行連接(1) 客戶端的編程流程:a創(chuàng)建Socket對象,向Server的監(jiān)聽端口請求;b通過向新Socket中讀寫數(shù)據(jù)與Server端通信;c關閉Socket,結束與Server端; (2)服務器端的編程流程:1打開Server Socket,創(chuàng)建一個服務器型套接字和一個普通套接字,服務器型套接字在指定端口為客戶端請求的Socket 服務; 2 等待來自客戶端的Client端的請求; 3接收Client端的請求,用返回的Socket建立連接; 4通過向Socket中讀寫

5、數(shù)據(jù)來與Client端通信; 5關閉Socket,結束與當前Client端的通信; 6關閉SerketSocket對象結束監(jiān)聽服務。3 客戶端設計客戶端主要完成建立連接、消息輸入、消息發(fā)送、消息存儲功能。功能含義如下:1. 建立連接:建立一個ServerSocket連接,不斷偵聽是否有服務端連接或者斷開連接。2. 消息輸入:根據(jù)用戶輸入的消息,將消息顯示在屏幕面板上。3. 消息發(fā)送:把用戶輸入的消息作為字符串通過Socket端口發(fā)送到服務器。4. 消息存儲:把用戶輸入的消息存儲到data.txt文件中,以便用戶以后查閱聊天記錄??蛻舳嗽O計如下:1. 界面設計2. 連接設計3. 接收信息設計4.

6、 用戶信息設計5. 幫助設計客戶端用戶設計的IP地址和端口號連接到相應的服務器,通過接收用戶輸入的消息,然后通過所監(jiān)聽的端口把消息發(fā)送到服務端,由服務端把消息發(fā)送到指定的用戶用戶連接服務器1客戶端請求連接 客戶端通過connect()請求連接,填寫端口號以與IP地址,填寫自己的信息。2服務器端響應 服務器端的監(jiān)聽器監(jiān)聽到客戶端的連接請求后,檢測后允許客戶端連接到服務器。3給客戶端返回信息 連接成功后服務器返回給客戶端連接成功的信息,并且給所有的用戶發(fā)送用戶登錄信息。4關閉Socket連接 當以上的程序都正常運行后,需要關閉Socket連接,否則將會浪費服務器與客戶端之間的資源。5用戶退出5.1

7、接收退出信息 當用戶退出時,客戶端將會用基于Socket的對象輸出流發(fā)送給服務器退出對象。5.2在線列表中刪除用戶 用戶退出后應該把用戶從在線列表中刪除,否則用戶退出用戶還在在線列表中,那么該用戶下次將會無法登錄。5.3更新在線列表 用戶退出后將服務器端監(jiān)控界面的用戶列表更新。否則用戶數(shù)據(jù)將會不同步。4 客戶端主要代碼/* * 事件處理 */publicvoid actionPerformed(ActionEvent e) Object obj = e.getSource();if (obj = userItem | obj = userButton) /用戶信息設置/調(diào)出用戶信息設置對話框U

8、serConf userConf = new UserConf(this,userName);userConf.setVisible(true);userName = userConf.userInputName;elseif (obj = connectItem | obj = connectButton) /連接服務端設置/調(diào)出連接設置對話框ConnectConf conConf = new ConnectConf(this,ip,port);conConf.setVisible(true);ip = conConf.userInputIp;port = conConf.userInput

9、Port;elseif (obj = loginItem | obj = loginButton) /登錄Connect();elseif (obj = logoffItem | obj = logoffButton) /注銷DisConnect();showStatus.setText("");elseif(obj = dataItem)tryFile read=new File("data.txt");Desktop.getDesktop().open(read);catch (IOException e1)e1.printStackTrace();

10、elseif (obj = clientMessage | obj = clientMessageButton) /發(fā)送消息SendMessage();clientMessage.setText("");elseif (obj = exitButton | obj = exitItem) /退出int j=JOptionPane.showConfirmDialog(this,"真的要退出嗎?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOpti

11、onPane.YES_OPTION)if(type = 1)DisConnect();System.exit(0);elseif (obj = helpItem) /菜單欄中的幫助/調(diào)出幫助對話框Help helpDialog = new Help(this);helpDialog.setVisible(true);publicvoid run()while(!socket.isClosed()tryString type = (String)input.readObject();if(type.equalsIgnoreCase("系統(tǒng)信息")String sysmsg =

12、 (String)input.readObject();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String ly_time = sdf.format(new Date();textarea.append(ly_time);textarea.append("n");textarea.append("系統(tǒng)信息: "+sysmsg);elseif(type.equalsIgnoreCase("服務關閉")output.clo

13、se();input.close();socket.close();textarea.append("服務器已關閉!n");break;elseif(type.equalsIgnoreCase("聊天信息")String message = (String)input.readObject();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String ly_time = sdf.format(new Date();textarea.append

14、(ly_time);textarea.append("n");textarea.append(message);tryrecord=new BufferedWriter(new FileWriter("data.txt",true);record.write(ly_time);record.newLine();record.write(message);record.newLine();record.close();catch (IOException e)e.printStackTrace();elseif(type.equalsIgnoreCase(

15、"用戶列表")String userlist = (String)input.readObject();String usernames = userlist.split("n");combobox.removeAllItems();int i =0;combobox.addItem("所有人");while(i < usernames.length)combobox.addItem(usernamesi);i +;combobox.setSelectedIndex(0);showStatus.setText("在線用

16、戶 " + usernames.length + " 人");catch (Exception e )System.out.println(e);5 設計體會本次課程設計歷時將近兩個月,當老師布置課程設計題目時還覺得這個課程設計很簡單,再加上正在學Java,以與相關界面設計,當時還沒有學Socket編程,覺得只要學號Socket就行差不多了,但是在做的過程中,要寫需求分析等資料,之前也沒怎么寫過,對這方面不是很了解,所以遇到了種種困難,好多功能和邏輯都沒想到,導致后來寫程序的時候走了很過彎路。還有就是在學習Socket編程的時候,本來覺得不就是Java里面的一個類

17、嗎,這還不好寫嗎,但是真的用起來,就沒有那么簡單了,不是這兒出錯就是那兒出錯,最后看了幾個例子,然后有看了好多的API函數(shù),慢慢的,也就寫的越來越順手了。服務器端程序設計模塊:作為C/S模式下的系統(tǒng)開發(fā),很顯然服務器端程序的設計是非常重要的。下面就服務器端的相關程序模塊進行設計,并一定程度上實現(xiàn)了相關功能。主服務器類的設計設計服務器時需要考慮如下幾個因素:(1)服務器的運行速度;(2)服務器的響應速度,包括新建連接和發(fā)送數(shù)據(jù)的響應速度;(3)I/O吞吐量;(4)其他:流量控制(QoS)、安全性。針對TCP/IP協(xié)議的數(shù)據(jù)結構,設計服務器的程序結構需要考慮以下的因素:(1)多線程;(2)多進程;

18、(3)單線程。主服務器類實現(xiàn)了服務器端的多線程,使用SeverSocket s=newServerSocket(8080)語句在8080端口創(chuàng)建套接口;使用new ServerThread(socket)語句創(chuàng)建新的線程。主服務器類調(diào)用ServerThread類,而每個ServerThread實體就是一個獨立的線程,剛好對應于客戶端的連接請求響應線程。服務器端有一個(或多個)進程在指定的端口等待客戶的連接信息,一旦連接成功,就可以按設計的數(shù)據(jù)交換方法和格式進行數(shù)據(jù)傳輸??蛻舳酥辉谛枰臅r候向服務器端發(fā)出連接請求。實現(xiàn)界面如圖服務器端完成的功能是:對服務器的某一可用端口進行監(jiān)聽,以獲得客戶端請求

19、,從而對客戶端請求進行處理。因為是多客戶同時請求,所以要采用多線程,為每一個在線用戶分配一個線程,實時處理每個客戶端的請求。因此,對服務器端程序抽象如下:2、 公共數(shù)據(jù)處理 處理公共數(shù)據(jù)。如在線人數(shù)統(tǒng)計,客戶的公共數(shù)據(jù)(如通知等),客戶數(shù)據(jù)資料的存儲與讀取等(與數(shù)據(jù)庫交互);3、 端口監(jiān)聽器監(jiān)聽服務器某一端口,為每一在線客戶建立一個會話線程;4、 客戶請求處理 處理客戶的請求。根據(jù)客戶的請求執(zhí)行相應的操作。5、 服務器管理器服務器端的管理工具,如對數(shù)據(jù)進行統(tǒng)計服務器端的結構圖:服務器實現(xiàn)所涉與的幾個主要類以與各個類中主要的方法實現(xiàn):1. ChatServer.java 服務器的主框架類。 此類

20、實現(xiàn)接口ActionListener,用于對用戶事件的監(jiān)聽,以與對事件的處理。 /* * 事件處理 */publicvoid actionPerformed(ActionEvent e)Object obj = e.getSource();if (obj = startServer | obj = startItem) / 啟動服務端startService(); elseif (obj = stopServer | obj = stopItem) / 停止服務端int j = JOptionPane.showConfirmDialog(this, "真的停止服務嗎?",

21、"停止服務",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService(); elseif (obj = portSet | obj = portItem) / 端口設置/ 調(diào)出端口設置的對話框PortConf portConf = new PortConf(this);portConf.setVisible(true); elseif (obj = exitButton | obj = exitItem) / 退出程序int j = JO

22、ptionPane.showConfirmDialog(this, "真的要退出嗎?", "退出",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();System.exit(0); elseif (obj = helpItem) / 菜單欄中的幫助/ 調(diào)出幫助對話框Help helpDialog = new Help(this);helpDialog.setVisible(true); elseif (obj

23、 = sysMessage | obj = sysMessageButton) / 發(fā)送系統(tǒng)消息sendSystemMessage(); /* * 此函數(shù)用于啟動服務器,并在指定的端口監(jiān)聽客戶端的連接 */publicvoid startService()tryserverSocket = new ServerSocket(port, 10);messageShow.append("服務端已經(jīng)啟動,在" + port + "端口偵聽.n");startServer.setEnabled(false);startItem.setEnabled(false)

24、;portSet.setEnabled(false);portItem.setEnabled(false);stopServer.setEnabled(true);stopItem.setEnabled(true);sysMessage.setEnabled(true); catch (Exception e)e.printStackTrace();userLinkList = new UserLinkList();listenThread = new ServerListen(serverSocket, combobox, messageShow,showStatus, userLinkLi

25、st);listenThread.start();/* * 此函數(shù)用于關閉服務器,關閉服務器后給所有在線用戶發(fā)送服務器關閉的信息,服 * 務器關閉后,所有的input,output輸入輸出流都會關閉,并且socket也會關閉。 * 所有的數(shù)據(jù)都恢復初始化 */publicvoid stopService()try/ 向所有人發(fā)送服務器關閉的消息sendStopToAll();listenThread.isStop = true;serverSocket.close();int count = userLinkList.getCount();int i = 0;while (i < cou

26、nt)Node node = userLinkList.findUser(i);node.input.close();node.output.close();node.socket.close();i+;stopServer.setEnabled(false);stopItem.setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);sysMessage.setEnabled(false);messag

27、eShow.append("服務端已經(jīng)關閉n");combobox.removeAllItems();combobox.addItem("所有人"); catch (Exception e)e.printStackTrace();2. ServerListen.java 服務端的偵聽類。此類繼承于Thread類,服務器的監(jiān)聽類,等待用戶的連接,并且給在線用戶發(fā)送上線用戶的信息提示。publicvoid run()while(!isStop && !server.isClosed()tryclient = new Node();client

28、.socket = server.accept();client.output = new ObjectOutputStream(client.socket.getOutputStream();client.output.flush();client.input = new ObjectInputStream(client.socket.getInputStream();client.username = (String)client.input.readObject();/顯示提示信息combobox.addItem(client.username);userLinkList.addUser

29、(client);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = sdf.format(new Date();textarea.append(str + "n" + "用戶 " + client.username + " 上線" + "n");textfield.setText("在線用戶" + userLinkList.getCount() + "人n

30、");recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);recvThread.start();catch(Exception e)3. ServerReceive.java服務器收發(fā)消息的類。此類也繼承于Thread類,主要處理客戶端發(fā)來的信息,并對信息進行必要的處理,通過input輸入流以與output輸出流把信息輸出在指定用戶的對話框中。除此之外還對用戶下線時作必要的處理,提示用戶下線,以與顯示在線人數(shù)。publicvoid run()/向所有人發(fā)送用戶的列表sendUs

31、erList();while(!isStop && !client.socket.isClosed()tryString type = (String)client.input.readObject();if(type.equalsIgnoreCase("聊天信息")String toSomebody = (String)client.input.readObject();String status = (String)client.input.readObject();String action = (String)client.input.readObj

32、ect();String message = (String)client.input.readObject();String msg = client.username +" "+ action+ "對 "+ toSomebody + " 說 : "+ message + "n"if(status.equalsIgnoreCase("悄悄話")msg = " 悄悄話 " + msg;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = sdf.format(new Date(); textarea.append(str + "n" + msg);if(toSomebody.equalsIgnoreCase("所有人")sendToAll(msg);/向所有人發(fā)送消息elsetryclient.output.writeObject("聊天信息&qu

溫馨提示

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

評論

0/150

提交評論