版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
軟件工程課程設(shè)計報告題目:聊天軟件的設(shè)計與開發(fā)一、課程設(shè)計概述1.1.目的此次課程設(shè)計的目標是用JAVA語言實現(xiàn)一個功能比較完善的聊天軟件,在設(shè)計該軟件的過程中,結(jié)合軟件工程課堂上所學的軟件開發(fā)方法和知識,使系統(tǒng)具有注冊、登入、退出功能。具有群聊、私聊功能,能夠顯示在線好友,消息提醒等功能。1.2.任務(wù)通過認真閱讀老師所給的課程設(shè)計的題目要求,進行系統(tǒng)的需求分析和系統(tǒng)的開發(fā)與設(shè)計。1.3.開發(fā)環(huán)境:運行環(huán)境:Windows9x、2000、xp、2003,Linux必要環(huán)境:JDK1.5以上硬件環(huán)境:CPU400MHz以上,內(nèi)存64MB以上1.4.參考資料:[1].錢永秋等,軟件工程,清華大學出版社,2007年3月。[2].譚浩強等,Java語言程序設(shè)計,中國鐵路出版社,2004年12月。1.5組長馬鳳麗:負責服務(wù)器端的監(jiān)控,以及與客戶端的聯(lián)系。
組員蔣紹杰:負責客戶端用戶的注冊、登錄和聊天室主頁面。二、項目的需求分析過程及需求模型2.1.系統(tǒng)可行性分析計算機網(wǎng)絡(luò)的迅速發(fā)展,對人類社會諸多領(lǐng)域產(chǎn)生了巨大的影響。尤其是,隨著信息時代的來臨,人們之間愈來愈趨向于通過網(wǎng)絡(luò)來交流和傳遞信息。而聊天系統(tǒng)正是當前人們使用最多的中介。在這個平臺上,許多認識或不認識的人們彼此間能夠隨意的相互交流。因此,開發(fā)和架構(gòu)這種平臺符合時代發(fā)展的需要。本系統(tǒng)在開發(fā)中用到了局域網(wǎng)通信機制的原理,通過直接繼承Thread類來建立多線程。開發(fā)中利用了計算機網(wǎng)絡(luò)編程的基本理論知識,如TCP/IP協(xié)議、客戶端/服務(wù)器端模式(Client/Server模式)、網(wǎng)絡(luò)編程的設(shè)計方法等。在網(wǎng)絡(luò)編程中對信息的讀取、發(fā)送,是利用流來實現(xiàn)信息的交換,其中介紹了對實現(xiàn)一個系統(tǒng)的信息流的分析,包含了一些基本的軟件工程的方法。2.2.系統(tǒng)需求分析2.2.1.系統(tǒng)目標設(shè)計系統(tǒng)開發(fā)的總目標開發(fā)一個類似QQ的聊天室系統(tǒng),即HappyChat聊天系統(tǒng)。2.2.2.系統(tǒng)功能需求分析該系統(tǒng)應(yīng)具有如下功能:1、用戶注冊、登錄、退出;2、群聊、私聊;3、服務(wù)器發(fā)送系統(tǒng)消息;4、服務(wù)器踢人;5、保存日志;6、保存聊天信息;7、顯示在線好友、消息提醒等;8、顯示即時時間;2.2.3.系統(tǒng)功能描述1.服務(wù)器端 (1).處理用戶注冊 (2).處理用戶登錄 (3).處理用戶發(fā)送信息 (4).處理用戶得到信息 (5).處理用戶退出2.客戶端 (1).用戶注冊界面及結(jié)果 (2).用戶登錄界面及結(jié)果 (3).用戶發(fā)送信息界面及結(jié)果 (4).用戶得到信息界面及結(jié)果 (5).用戶退出界面及結(jié)果2.2.4.系統(tǒng)設(shè)計1、服務(wù)器結(jié)構(gòu)服務(wù)器端結(jié)構(gòu)圖示2、客戶端結(jié)構(gòu)客戶端結(jié)構(gòu)圖示1、AppServer.java 為服務(wù)器端監(jiān)聽類,負責服務(wù)器的啟動,包括啟動監(jiān)聽端口、服務(wù)器監(jiān)控界面。2、ServerFrame.java為服務(wù)器監(jiān)控窗體,負責監(jiān)控服務(wù)器運行狀態(tài)。3、Connection.java為服務(wù)器連接處理的具體實現(xiàn)。4、ChatClient.java為客戶端程序啟動類,負責客戶端的啟動和退出。5、Login.java為客戶端程序登錄界面,負責用戶帳號信息的驗證與反饋。6、Register.java為客戶端程序注冊界面,負責用戶帳號信息的注冊驗證與反饋。7、ChatRoom.java為客戶端程序聊天室主界面,負責接收、發(fā)送聊天內(nèi)容與服務(wù)器的Connection合作。8、Windowclose為ChatRoom.java的內(nèi)部類,負責監(jiān)聽聊天室界面的操作,當用戶退出時返回給服務(wù)器信息。9、Clock.java為客戶端程序的一個小程序,實現(xiàn)的一個石英鐘功能。三、實現(xiàn)細節(jié)概述:聊天室主要功能的實現(xiàn):從界面輸入登錄信息,然后與服務(wù)器建立Socket連接(連接時應(yīng)指定服務(wù)器的IP地址和端口號,而客戶端socket的端口由本方操作系統(tǒng)從空閑端口中確定),服務(wù)器端的“傾聽Socket”收到連接請求后,一般會接受連接請求,并生成一個服務(wù)端socket,專門負責與此客戶端socket的通信。一旦連接請求成功,客戶端將信息及請求通過本方socket的輸出流發(fā)送給服務(wù)器端相應(yīng)的socket,服務(wù)端則通過服務(wù)器端Socket的輸入流接受客戶端傳輸過來的信息及請求,分析是何請求,然后根據(jù)請求類型,進行相應(yīng)的處理(如登錄、轉(zhuǎn)發(fā)信息等)。服務(wù)方也可以根據(jù)需要,通過socket的輸出流發(fā)信息和請求給客戶端(公告)??蛻舴胶头?wù)方都可以通過關(guān)閉本方的socket而結(jié)束一次通訊過程。為了實現(xiàn)多客戶在線的請求,使用多線程機制來處理,對每一個客戶端連接通訊,服務(wù)器端都有一個線程專門負責處理。3.1客戶端細節(jié)3.1.1.注冊:當選擇注冊時,Register界面等待用戶輸入注冊信息,并將信息封裝成Register_Customer類,然后通過建立在Socket的連接之上的對象輸出流將用戶注冊信息發(fā)送給服務(wù)器端,服務(wù)器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection在收到信息后將驗證數(shù)據(jù)的完整性并在數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注冊,然后將注冊信息加入數(shù)據(jù)庫,最后將注冊結(jié)果返回給客戶端??蛻舳孙@示注冊結(jié)果。3.1.2.登錄:當選擇登錄時,客戶端由Login界面等待用戶輸入登錄信息后,封裝成Customer對象類然后通過建立在Socket的連接之上的對象輸出流將用戶登錄信息發(fā)送給服務(wù)器端,服務(wù)器端將請求轉(zhuǎn)發(fā)給Connection處理,Connection在收到信息后將驗證數(shù)據(jù)的完整性并在對象型數(shù)據(jù)庫中查找該用戶名是否已經(jīng)注冊,然后將注冊用戶的信息與登錄請求信息進行密碼驗證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結(jié)果返回給客戶端。若登錄成功,客戶端將啟動聊天室主界面。3.1.3.聊天a、發(fā)送聊天信息:私聊功能需在在線列表中選中私聊聊天對象,并勾選私聊選項。群聊功能取消對私聊功能的勾選即可。當用戶點擊完發(fā)送按鈕后,程序開始將當前用戶名、聊天對象、聊天內(nèi)容、表情和是否私聊進行封裝,然后獲取Socket連接,再用對象輸出流包裝Socket的輸出流將聊天信息對象發(fā)送給服務(wù)器端。b、接收聊天信息:用一個單獨的接收線程實現(xiàn),客戶端必須隨時接收服務(wù)器發(fā)來的消息,而讀取消息的方法采用的是阻塞式方法,若在事件處理程序中讀(占用的是事件處理線程)則會使程序在此后無法響應(yīng)用戶操作,所以需要生成一個單獨的線程專門用于讀取處理消息。而發(fā)送消息的方法則是將消息放入操作系統(tǒng)的發(fā)送緩沖區(qū)后就返回的,所以發(fā)送執(zhí)行的相當快,可以在事件處理線程中直接調(diào)用。發(fā)送和接收可以同時進行。3.2、服務(wù)器端細節(jié)3.2.1.注冊:創(chuàng)建一個File文件類,載入“user.txt”,再用對象輸入流ObjectInputStream包裝File文件類,將存儲在“user.txt”得向量對象Vector中載入內(nèi)存中,現(xiàn)在系統(tǒng)中的向量就是對象型數(shù)據(jù)庫,存儲著每條用戶信息對象。判斷是否是第一個注冊用戶,判斷用戶名是否已經(jīng)存在,判斷用戶名是否為系統(tǒng)關(guān)鍵字,用戶名有效后寫入數(shù)據(jù)庫,并給客戶端返回信息,關(guān)閉Socket連接。3.2.2.登錄:去數(shù)據(jù)庫讀用戶數(shù)據(jù),打開用戶數(shù)據(jù)庫文件“user.txt”,將用戶數(shù)據(jù)對象集載入內(nèi)存,以供下面的程序使用。驗證用戶名是否存在,驗證用戶密碼是否正確,驗證用戶是否已經(jīng)登錄,驗證是否已經(jīng)超過最大登錄人數(shù),如果以上驗證全部正確,返回客戶端信息,關(guān)閉Socket連接。3.2.3.退出:接收退出信息,當用戶退出時,客戶端將會用基于Socket的對象輸出流發(fā)給服務(wù)器退出對象,把用戶從在線列表中刪除,更新在線列表。3.2.4.聊天:接收用戶聊天信息,當用戶發(fā)送聊天信息時,服務(wù)端將會收到客戶端用Socket傳輸過來的聊天信息對象,然后將其轉(zhuǎn)換為Message對象,返回聊天信息,然后系統(tǒng)從Message中提出消息類型,再根據(jù)類型將消息強制轉(zhuǎn)化ChatMessage,調(diào)用ChatMeaage中方法,獲取目的客戶名稱列表,根據(jù)目的地用戶名從用戶名、socket鍵值表中獲取socket,再通過socket將Message轉(zhuǎn)發(fā)到相應(yīng)的用戶。四、系統(tǒng)展示1、注冊客戶端注冊界面登錄客戶端登錄界面聊天界面聊天界面4、服務(wù)器界面服務(wù)器管理界面服務(wù)器用戶信息管理界面測試與運行記錄5.1.注冊賬號測試用例編號輸入/動作期望的輸出/相應(yīng)1用戶名和密碼均為數(shù)字,進行注冊注冊成功2用戶名和密碼均為字母,進行注冊注冊成功3用戶名為數(shù)字,密碼為字母,進行注冊注冊成功4用戶名為字母,密碼為數(shù)字注冊成功5必填項分別為空注冊顯示必填信息6用戶名含有非法字符注冊顯示用戶名字符驗證提示信息7密碼含有非法字符注冊顯示密碼字符驗證提示信息8兩次輸入密碼不一致進行注冊顯示兩次輸入密碼不一致提示信息9以已經(jīng)注冊的用戶名進行注冊顯示用戶名已存在提示信息10非法郵箱進行注冊顯示郵箱格式不正確提示信息5.2.登錄測試用例編號輸入/動作期望的輸出/相應(yīng)1使用合法用戶名和密碼登陸登陸成功2使用錯誤的用戶名或密碼登陸顯示用戶名或密碼錯誤提示信息3用戶名為空登陸顯示請輸入用戶名提示信息4改變合法用戶名或密碼的大小寫登陸顯示用戶名或密碼錯誤提示信息5在合法用戶名或密碼前插入空格顯示用戶名或密碼錯誤提示信息6在合法用戶名或密碼中間插入空格顯示用戶名或密碼錯誤提示信息7在合法用戶名或密碼后插入空格顯示用戶名或密碼錯誤提示信息8使用已被禁用的賬號登陸顯示賬號被禁用等相應(yīng)提示信息9使用已被刪除的賬號登陸顯示不存在此用戶等相應(yīng)提示信息11密碼為空進行登陸顯示請輸入密碼,密碼不能為空提示信息12用戶名和密碼均為空登陸顯示請輸入用戶名和密碼提示信息六、課程設(shè)計完成結(jié)果分析經(jīng)過幾周的課程設(shè)計,我深刻的認識到在軟件開發(fā)過程中要開發(fā)一個成功的軟件,軟件文檔是一個必不可少的東西,它關(guān)系著軟件開發(fā)的過程,關(guān)系著軟件開發(fā)的成敗。開發(fā)經(jīng)驗不足,在軟件的開發(fā)過程中遇到了很多復(fù)雜的問題,比如模塊的劃分、數(shù)據(jù)庫的設(shè)計等問題不知道怎么解決,最終通過努力也成功解決了這些問題。通過幾周的軟件工程課程設(shè)計,我基本掌握了軟件工程的基本思想以及軟件開發(fā)的基本流程。并受到了一次用專業(yè)知識、專業(yè)技能分析和解決問題的全面系統(tǒng)的鍛煉。并且在綜合知識的選用方面,在應(yīng)用軟件開發(fā)的基本思想、方法方面,以及在常用編程設(shè)計思路技巧的掌握方面都能向前邁了一大步。在這次的課程設(shè)計中,讓我們深深地體現(xiàn)到進行軟件開發(fā)不是一件簡單的事情,它需要設(shè)計者具有全面的專業(yè)知識、縝密的思維、嚴謹?shù)墓ぷ鲬B(tài)度以及較高的分析問題、解決問題的能力,而我在很多方面還有欠缺。在以后的學習過程中我會從這次課程設(shè)計中汲取教訓并尋求高效率優(yōu)方法的學習態(tài)度不斷充實自我完善自我。七、程序聊天室主頁面:importjavax.swing.*;importjavax.swing.event.ChangeEvent;importjavax.swing.event.ChangeListener;importjava.awt.*;importjava.awt.event.*;import.*;importjava.io.*;importjava.util.*;/*<p>Title:HappyChat聊天系統(tǒng)聊天程序</p>*<p>Description:系統(tǒng)用戶登錄后進行聊天</p>*/publicclassChatRoomextendsThreadimplementsActionListener{ privateJComboBoxdaXiaoComboBox; privateJComboBoxyangShiComboBox; privateJComboBoxzitiComboBox; privateJComboBoxemote; staticJFramefrmChat; JPanelpnlChat; JButtonbtnCls,btnExit,btnSend,btnClear,btnSave,btnTimer; JLabellblUserList,lblUserMessage,lblSendMessage,lblChatUser; JLabellblUserTotal,lblCount,lblBack; JTextFieldtxtMessage; java.awt.ListlstUserList; TextAreataUserMessage; JComboBoxcmbUser; JCheckBoxchPrivateChat; StringstrServerIp,strLoginName; Threadthread; finalJLabelheadLabel=newJLabel(); //用于將窗口用于定位 Dimensionscrnsize; Toolkittoolkit=Toolkit.getDefaultToolkit(); Messagemessobj=null; StringserverMessage=""; finalJSliderblueSlider=newJSlider(); finalJSliderredSlider=newJSlider(); finalJSlidergreenSlider=newJSlider(); finalJLabelhanziLabel=newJLabel(); //構(gòu)造方法 publicChatRoom(Stringname,Stringip){ //Dialogd=newFontDialog(); strServerIp=ip; strLoginName=name; frmChat=newJFrame("聊天室"+"[用戶:"+name+"]"); pnlChat=newJPanel(); frmChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frmChat.getContentPane().add(pnlChat); FontfntDisp1=newFont("宋體",Font.PLAIN,12); Stringlist[]={"所有人"}; btnCls=newJButton("清屏(C)"); btnExit=newJButton("退出(X)"); btnSend=newJButton("發(fā)送(N)"); btnSave=newJButton("保存(S)"); btnTimer=newJButton("時鐘(T)"); lblUserList=newJLabel("【在線用戶列表】"); lblUserMessage=newJLabel("【聊天信息】"); lblSendMessage=newJLabel("聊天內(nèi)容:"); lblChatUser=newJLabel("你對:"); lblUserTotal=newJLabel("在線人數(shù):"); lblCount=newJLabel("0"); lstUserList=newjava.awt.List(); txtMessage=newJTextField(170); cmbUser=newJComboBox(list); //chenmin cmbUser.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ freshHead(); } }); chPrivateChat=newJCheckBox("私聊"); taUserMessage=newTextArea("",300,200, TextArea.SCROLLBARS_VERTICAL_ONLY);//只能向下滾動 //taUserMessage.setText("aaaaaa漢字aaaa"); taUserMessage.setForeground(newColor(0,0,0)); taUserMessage.setEditable(false);//不可寫入 /*********************************************************************** *該布局采用手動布局setBounds設(shè)置組件位置*setFont設(shè)置字體、字型、字號*setForeground設(shè)置文字的顏色* *setBackground設(shè)置背景色*setOpaque將背景設(shè)置為透明 */ pnlChat.setLayout(null); pnlChat.setBackground(newColor(52,130,203)); btnTimer.setBounds(400,360,80,25); btnSave.setBounds(500,330,80,25); btnCls.setBounds(400,330,80,25); btnExit.setBounds(500,360,80,25); btnSend.setBounds(500,300,80,25); lblUserList.setBounds(5,0,120,40); lblUserTotal.setBounds(130,0,60,40); lblCount.setBounds(190,0,60,40); lblUserMessage.setBounds(225,0,180,40); lblChatUser.setBounds(10,290,40,40); lblSendMessage.setBounds(210,290,60,40); //lblUserTotal.setBounds(10,340,100,40); //lblCount.setBounds(73,340,100,40); lstUserList.setBounds(5,40,210,255); taUserMessage.setBounds(225,40,360,255); txtMessage.setBounds(270,300,210,25); cmbUser.setBounds(50,300,80,25); chPrivateChat.setBounds(333,336,60,20); btnTimer.setFont(fntDisp1); btnCls.setFont(fntDisp1); btnExit.setFont(fntDisp1); btnSend.setFont(fntDisp1); btnSave.setFont(fntDisp1); lblUserList.setFont(fntDisp1); lblUserMessage.setFont(fntDisp1); lblChatUser.setFont(fntDisp1); lblSendMessage.setFont(fntDisp1); lblUserTotal.setFont(fntDisp1); lblCount.setFont(fntDisp1); cmbUser.setFont(fntDisp1); chPrivateChat.setFont(fntDisp1); //taUserMessage.setFont(newFont("新宋體",Font.BOLD|Font.ITALIC,20)); lblUserList.setForeground(Color.YELLOW); lblUserMessage.setForeground(Color.YELLOW); lblSendMessage.setForeground(Color.black); lblChatUser.setForeground(Color.black); lblSendMessage.setForeground(Color.black); lblUserTotal.setForeground(Color.YELLOW); lblCount.setForeground(Color.YELLOW); cmbUser.setForeground(Color.black); chPrivateChat.setForeground(Color.black); lstUserList.setBackground(Color.white); taUserMessage.setBackground(Color.white); btnTimer.setBackground(Color.ORANGE); btnCls.setBackground(Color.ORANGE); btnExit.setBackground(Color.ORANGE); btnSend.setBackground(Color.PINK); btnSave.setBackground(Color.ORANGE); pnlChat.add(btnTimer); pnlChat.add(btnCls); pnlChat.add(btnExit); pnlChat.add(btnSend); pnlChat.add(btnSave); pnlChat.add(lblUserList); pnlChat.add(lblUserMessage); pnlChat.add(lblSendMessage); pnlChat.add(lblChatUser); pnlChat.add(lblUserTotal); pnlChat.add(lblCount); pnlChat.add(lstUserList); pnlChat.add(taUserMessage); pnlChat.add(txtMessage); pnlChat.add(cmbUser); pnlChat.add(chPrivateChat); frmChat.addWindowListener(newWindowclose()); btnTimer.addActionListener(this); btnCls.addActionListener(this); btnExit.addActionListener(this); btnSend.addActionListener(this); btnSave.addActionListener(this); lstUserList.addActionListener(this); txtMessage.addActionListener(this); headLabel.setHorizontalAlignment(SwingConstants.CENTER); headLabel.setIcon(newImageIcon("face//1.JPG")); headLabel.setBounds(15,335,70,60); pnlChat.add(headLabel); emote=newJComboBox(); emote.setModel(newDefaultComboBoxModel(newString[]{"表情","微笑", "甜笑","驚喜","嘻嘻","扮酷","嘿嘿","傻笑","好奇","媚眼","鬼臉","陶醉", "害羞","生氣","嚷嚷","發(fā)怒","傷心","高明","菜鳥","問號","狂笑","大哭", "示愛","呻吟","想想"})); emote.setBounds(141,301,60,23); pnlChat.add(emote); zitiComboBox=newJComboBox(); zitiComboBox.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ freshFont(); } }); zitiComboBox.setModel(newDefaultComboBoxModel(newString[]{"宋體", "黑體"})); zitiComboBox.setBounds(76,337,64,23); pnlChat.add(zitiComboBox); yangShiComboBox=newJComboBox(); yangShiComboBox.setModel(newDefaultComboBoxModel(newString[]{"正規(guī)", "粗體","斜體","粗斜"})); yangShiComboBox.setBounds(153,337,52,23); yangShiComboBox.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ freshFont(); } }); pnlChat.add(yangShiComboBox); daXiaoComboBox=newJComboBox(); daXiaoComboBox.setModel(newDefaultComboBoxModel(newString[]{"12", "14","16","18","20"})); daXiaoComboBox.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventarg0){ freshFont(); } }); daXiaoComboBox.setBounds(220,335,40,23); pnlChat.add(daXiaoComboBox); blueSlider.setMaximum(255); blueSlider.setValue(128); blueSlider.setMinimum(0); blueSlider.addChangeListener(newChangeListener(){ publicvoidstateChanged(ChangeEventarg0){ //TODO自動生成方法存根 freshColor(); } }); //slider.setModel(null); blueSlider.setBounds(80,365,180,10); pnlChat.add(blueSlider); redSlider.setMaximum(255); redSlider.setValue(128); redSlider.setMinimum(0); redSlider.addChangeListener(newChangeListener(){ publicvoidstateChanged(ChangeEventarg0){ //TODO自動生成方法存根 freshColor(); } }); redSlider.setBounds(80,380,180,10); pnlChat.add(redSlider); greenSlider.setMaximum(255); greenSlider.setValue(128); greenSlider.setMinimum(0); greenSlider.addChangeListener(newChangeListener(){ publicvoidstateChanged(ChangeEventarg0){ //TODO自動生成方法存根 freshColor(); } }); greenSlider.setBounds(80,395,180,10); pnlChat.add(greenSlider); hanziLabel.setForeground(newColor(128,128,128)); hanziLabel.setHorizontalAlignment(SwingConstants.CENTER); hanziLabel.setFont(newFont("宋體",Font.BOLD,18)); hanziLabel.setBackground(Color.ORANGE); hanziLabel.setText("漢字"); hanziLabel.setBounds(273,360,57,50); pnlChat.add(hanziLabel); //啟動聊天頁面信息刷新線程 Threadthread=newThread(this); thread.start(); //Iconlog=newImageIcon("images\\chat.jpg"); //lblBack=newJLabel(log); //lblBack.setBounds(1,1,600,420); //pnlChat.add(lblBack); frmChat.setSize(600,461); frmChat.setVisible(true); frmChat.setResizable(false); //將窗口定位在屏幕中央 scrnsize=toolkit.getScreenSize(); frmChat.setLocation(scrnsize.width/2-frmChat.getWidth()/2, scrnsize.height/2-frmChat.getHeight()/2); Imageimg=toolkit.getImage("images\\appico.jpg"); frmChat.setIconImage(img); }//構(gòu)造方法結(jié)束 protectedvoidfreshFont(){ //TODO自動生成方法存根 Stringziti=zitiComboBox.getSelectedItem().toString(); intyangShi=0; StringyangShiString=yangShiComboBox.getSelectedItem().toString(); if(yangShiString.equals("常規(guī)")){ yangShi=Font.PLAIN; }elseif(yangShiString.equals("粗體")){ yangShi=Font.BOLD; }elseif(yangShiString.equals("斜體")){ yangShi=Font.ITALIC; }elseif(yangShiString.equals("粗斜")){ yangShi=Font.BOLD|Font.ITALIC; } intdaXiao=Integer.parseInt(daXiaoComboBox.getSelectedItem() .toString()); taUserMessage.setFont(newFont(ziti,yangShi,daXiao)); taUserMessage.setForeground(hanziLabel.getForeground()); } protectedvoidfreshColor(){ //TODO自動生成方法存根 hanziLabel.setForeground(newColor(blueSlider.getValue(),redSlider .getValue(),greenSlider.getValue())); freshFont(); } @SuppressWarnings("deprecation") publicvoidrun(){ intintMessageCounter=0; intintUserTotal=0; booleanisFirstLogin=true;//判斷是否剛登陸 booleanisFound;//判斷是否找到用戶 Vectoruser_exit=newVector(); try{ //SockettoServer; //toServer=newSocket(strServerIp,1001); for(;;){ SockettoServer; toServer=newSocket(strServerIp,1001); //將信息發(fā)往服務(wù)器 messobj=newMessage(); ObjectOutputStreamstreamtoserver=newObjectOutputStream( toServer.getOutputStream()); streamtoserver.writeObject((Message)messobj); //收來自服務(wù)器的信息 ObjectInputStreamstreamfromserver=newObjectInputStream( toServer.getInputStream()); messobj=(Message)streamfromserver.readObject(); ////////刷新聊天信息列表////////// if(isFirstLogin)//如果剛登陸 { intMessageCounter=messobj.chat.size();//屏蔽該用戶登陸前的聊天內(nèi)容 isFirstLogin=false; } if(strLoginName.equals(messobj.ti)){ //taUserMessage.append("nibeiti"); exitChatRoom(); JOptionPane.showMessageDialog(null,strLoginName +"你被管理員剔除!"); } if(!serverMessage.equals(messobj.serverMessage)){ serverMessage=messobj.serverMessage; taUserMessage.append("[系統(tǒng)消息]:"+serverMessage+"\n"); } //taUserMessage.setText(""); for(inti=intMessageCounter;i<messobj.chat.size();i++){ Chattemp=(Chat)messobj.chat.elementAt(i); //chenmin Stringemote=temp.emote; if(emote.equals("表情")){ emote=""; }else{ emote+="地"; } Stringtemp_message; if(temp.chatUser.equals(strLoginName)){ if(temp.chatToUser.equals(strLoginName)){ temp_message="系統(tǒng)提示您:請不要自言自語!"+"\n"; }else{ if(!temp.whisper)//不是悄悄話 { temp_message="【你】對【"+temp.chatToUser+"】" +emote+"說:"+temp.chatMessage +"\n"; }else{ temp_message="【你】悄悄對【"+temp.chatToUser +"】"+emote+"說:"+temp.chatMessage +"\n"; } } }else{ if(temp.chatToUser.equals(strLoginName)){ if(!temp.whisper)//不是悄悄話 { temp_message="【"+temp.chatUser+"】對【你】" +emote+"說:"+temp.chatMessage +"\n"; }else{ temp_message="【"+temp.chatUser+"】悄悄對【你】" +emote+"說:"+temp.chatMessage +"\n"; } }else{ if(!temp.chatUser.equals(temp.chatToUser))//對方?jīng)]有自言自語 { if(!temp.whisper)//不是悄悄話 { temp_message="【"+temp.chatUser+"】對【" +temp.chatToUser+"】"+emote +"說:"+temp.chatMessage+"\n"; }else{ temp_message=""; } }else{ temp_message=""; } } } taUserMessage.append(temp_message); intMessageCounter++; } ////////刷新在線用戶////////// lstUserList.clear(); for(inti=0;i<messobj.userOnLine.size();i++){ StringUser=((Customer)messobj.userOnLine.elementAt(i)).custName; lstUserList.addItem(User); } Integera=newInteger(messobj.userOnLine.size()); lblCount.setText(a.toString()); //顯示用戶進入聊天室的信息 if(messobj.userOnLine.size()>intUserTotal){ //chenmin Stringtempstr=((Customer)messobj.userOnLine .elementAt(messobj.userOnLine.size()-1)).custName; //Stringtempstr=messobj.userOnLine.elementAt( //messobj.userOnLine.size()-1).toString(); if(!tempstr.equals(strLoginName)){ taUserMessage.append("【"+tempstr+"】來了"+"\n"); } } //顯示用戶離開聊天室的信息 //顯示用戶離開聊天室的信息 if(messobj.userOnLine.size()<intUserTotal){ for(intb=0;b<user_exit.size();b++){ isFound=false; for(intc=0;c<messobj.userOnLine.size();c++){ Stringtempstr=((Customer)user_exit.elementAt(b)).custName; if(tempstr.equals(((Customer)messobj.userOnLine .elementAt(c)).custName)){ isFound=true; break; } } if(!isFound)//沒有發(fā)現(xiàn)該用戶 { Stringtempstr=((Customer)user_exit.elementAt(b)).custName; if(!tempstr.equals(strLoginName)){ taUserMessage.append("【"+tempstr+"】走了" +"\n"); } } } } user_exit=messobj.userOnLine; intUserTotal=messobj.userOnLine.size(); streamtoserver.close(); streamfromserver.close(); toServer.close(); Thread.sleep(3000); } }catch(Exceptione){ @SuppressWarnings("unused") JOptionPanejop=newJOptionPane(); JOptionPane.showMessageDialog(null,"不能連接服務(wù)器!"); e.printStackTrace(); frmChat.dispose(); //System.out.println(); //System.out.println(e.getMessage()); } }//run()結(jié)束 privatevoidexitChatRoom(){ //TODO自動生成方法存根 exit(); } ///////////監(jiān)聽按鈕響應(yīng)////////////// publicvoidactionPerformed(ActionEventae){ Objectsource=(Object)ae.getSource(); if(source.equals(btnTimer)){ newClock(); } if(source.equals(btnCls)){ clearMessage(); } if(source.equals(btnExit)){ exit(); } if(source.equals(btnSend)){ sendMessage(); } if(source.equals(btnSave)){ saveMessage(); } if(source.equals(lstUserList))//雙擊列表框 { changeUser(); } }//actionPerformed()結(jié)束 ///////////監(jiān)聽窗口關(guān)閉響應(yīng)////////////// classWindowcloseextendsWindowAdapter{ publicvoidwindowClosing(WindowEvente){ exit(); } } //"清屏"按鈕 publicvoidclearMessage(){ taUserMessage.setText(""); } //"退出"按鈕 publicvoidexit(){ Exitexit=newExit(); exit.exitname=strLoginName; //發(fā)送退出信息 try{ SockettoServer=newSocket(strServerIp,1001); //向服務(wù)器發(fā)送信息 ObjectOutputStreamoutObj=newObjectOutputStream(toServer .getOutputStream()); outObj.writeObject(exit); outObj.close(); toServer.close(); frmChat.dispose(); //this.destroy(); }catch(Exceptione){ } }//exit()結(jié)束 //"發(fā)送"按鈕 publicvoidsendMessage(){ Chatchatobj=newChat(); chatobj.chatUser=strLoginName; chatobj.chatMessage=txtMessage.getText(); chatobj.chatToUser=String.valueOf(cmbUser.getSelectedItem()); chatobj.whisper=chPrivateChat
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小班下學期工作計劃15篇
- 設(shè)計師個人工作總結(jié)2024報告
- 廢舊輪胎低溫真空裂解無害化資源化節(jié)能與環(huán)保示范項目可行性研究報告
- 年會領(lǐng)導(dǎo)發(fā)言稿大全簡短(模板7篇)
- 工業(yè)項目可行性研究報告
- 普外科診療指南技術(shù)操作規(guī)范
- 卓越小升初入學水平測試卷
- 人事代理人員用工合同
- 入住病房協(xié)議書模板
- 銷售部領(lǐng)導(dǎo)年度發(fā)言稿5篇
- (完整版)病例演講比賽PPT模板
- 直播合作協(xié)議
- 社科類課題申報工作輔導(dǎo)報告課件
- 頭痛的診治策略講課課件
- 沙利文-內(nèi)窺鏡行業(yè)現(xiàn)狀與發(fā)展趨勢藍皮書
- 國家開放大學一網(wǎng)一平臺電大《建筑測量》實驗報告1-5題庫
- 規(guī)范診療服務(wù)行為專項整治行動自查表
- (新平臺)國家開放大學《建設(shè)法規(guī)》形考任務(wù)1-4參考答案
- 精益工廠布局及精益物流規(guī)劃課件
- 注射液無菌檢查的方法學驗證方案
- 2023年口腔醫(yī)學期末復(fù)習-牙周病學(口腔醫(yī)學)考試歷年真題薈萃帶答案
評論
0/150
提交評論