版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 密 級 公 開 學(xué) 號 </p><p><b> XX學(xué)院</b></p><p><b> 畢業(yè)設(shè)計</b></p><p> 基于JAVA的即時通訊的設(shè)計與開發(fā)</p><p>
2、; 基于JAVA的即時通訊的設(shè)計與開發(fā)</p><p> 摘 要:即時通訊(Instant Messenger),是一種基于互聯(lián)網(wǎng)的即時交流消息的業(yè)務(wù),所常見的有: MSN、QQ、UC等。這些都具有很強的商業(yè)化特點。在現(xiàn)有網(wǎng)絡(luò)基礎(chǔ)上,研究一個安全的、私有的、本地或本部門化的即時通訊工具,非常有必要。Java是我們當(dāng)前所使用的比較流行的開發(fā)語言,它有著自己簡單易用的特點與性能優(yōu)勢(比如跨平臺、安全性、多線程、
3、網(wǎng)絡(luò)Socket編程、數(shù)據(jù)流概念)。通過對即時通訊工具的需求、體系結(jié)構(gòu)、構(gòu)成模塊等的分析和研究,采用java語言和eclipse為基本開發(fā)環(huán)境,應(yīng)用重構(gòu)開發(fā)方法,優(yōu)化了系統(tǒng)設(shè)計,利用局域網(wǎng)通信機制的原理(即通過直接繼承Thread類來建立多線程),實現(xiàn)了網(wǎng)絡(luò)聊天服務(wù)器程序和網(wǎng)絡(luò)聊天客戶程序。前者通過Socket套接字建立服務(wù)器,使得服務(wù)器能讀取并且轉(zhuǎn)發(fā)客戶端發(fā)來信息,同時還能刷新用戶列表。后者通過與服務(wù)器建立連接,能夠?qū)崿F(xiàn)客戶端與客戶端
4、的信息交流。</p><p> 關(guān)鍵詞:即時通訊;多線程;SOCKET編程;MySQL</p><p> DESIGN AND DEVELOPMENT OF A SIMPLE INSTANT COMMUNICATION TOOL BASED ON JAVA</p><p> Abstract: IM (Instant Messenger) is the bus
5、iness of an Internet-based real-time exchange of messages,for example : MSN, QQ, UC, and so on. These have a strong commercial characteristics. Researching on the basis of the existing network, a safe, private, local or
6、sector of the instant messaging tools is very necessary. Java is currently much popular development language, it has its own easy-to-use features and performance advantages (such as cross-platform, security, multi-thread
7、ed, network socke</p><p> Keywords: instant message; multithreaded; socket program; MySQL</p><p><b> 目 錄</b></p><p><b> 摘 要II</b></p><p>
8、 AbstractIII</p><p><b> 1引言1</b></p><p> 1.1項目開發(fā)的背景1</p><p><b> 1.2研究現(xiàn)狀1</b></p><p> 1.3項目研究的內(nèi)容1</p><p> 2相關(guān)理論及技術(shù)基礎(chǔ)與開發(fā)平臺
9、2</p><p> 2.1即時通訊應(yīng)用工作原理分析2</p><p><b> 2.2所用技術(shù)2</b></p><p> 2.3工具及開發(fā)平臺2</p><p> 2.4 系統(tǒng)配置要求3</p><p> 3系統(tǒng)體系結(jié)構(gòu)的設(shè)計4</p><p>
10、3.1 數(shù)據(jù)庫的設(shè)計4</p><p> 3.2系統(tǒng)模塊設(shè)計4</p><p> 3.2.1系統(tǒng)功能模塊圖:5</p><p> 3.3系統(tǒng)類設(shè)計8</p><p><b> 4系統(tǒng)實現(xiàn)11</b></p><p> 4.2 注冊模塊11</p><p&g
11、t; 4.2.1 流程圖11</p><p> 4.2.2 關(guān)鍵代碼11</p><p> 4.3 登錄模塊13</p><p> 4.3.1 流程圖13</p><p> 4.3.2 關(guān)鍵代碼13</p><p> 4.4 聊天模塊16</p><p> 4.4.1
12、 流程圖16</p><p> 4.4.2 關(guān)鍵代碼16</p><p> 4.5 文件模塊20</p><p> 4.5.1 流程圖20</p><p> 4.5.2 關(guān)鍵代碼20</p><p> 4.6 用戶管理模塊24</p><p> 4.6.1 流程圖24&
13、lt;/p><p> 4.6.2 關(guān)鍵代碼24</p><p> 4.7 用戶界面的設(shè)計26</p><p><b> 結(jié) 論29</b></p><p><b> 致 謝31</b></p><p><b> 附錄132</b>
14、</p><p><b> 1引言</b></p><p> 1.1項目開發(fā)的背景</p><p> 我們的生活需要越來越方便、快捷的通訊工具。盡管當(dāng)前有一些類似的工具,如:QQ、飛信等。這些軟件屬于公共性軟件,安全性難言可靠。盜取用戶賬號進(jìn)行網(wǎng)絡(luò)詐騙和利用各種虛假中獎信息進(jìn)行詐騙的事情屢見不鮮。如果某企事業(yè)單位內(nèi)部為更便捷的交流,特別是
15、當(dāng)涉及較為敏感性話題時,顯然這些軟件還不能夠適應(yīng)這一需求。為此設(shè)計一個java的即時通訊。本系統(tǒng)包括服務(wù)器端和客戶端,可以在企業(yè)內(nèi)部網(wǎng)絡(luò)和互聯(lián)網(wǎng)上運行(主要是在企業(yè)內(nèi)部)。同時本系統(tǒng)具有Java應(yīng)用的跨平臺特性,方便運行在各個系統(tǒng)之上。同時它具有比較漂亮的界面,與常用的qq有許多類似于功能(比如可以和好友進(jìn)行在線交流、添加刪除好友、即時發(fā)送、即時回復(fù)等功能)。</p><p><b> 1.2研究現(xiàn)狀
16、</b></p><p> 隨著互聯(lián)網(wǎng)得迅速發(fā)展,上網(wǎng)聊天已經(jīng)成為人們生活中不可或缺的一部分,即時通訊也在不斷更新發(fā)展。從最早的ICQ( I seek you)橫空問世到現(xiàn)在的qq、msn等風(fēng)靡全球,即時通訊也不過才走過了17個年頭。功能從最早的只能發(fā)送文字到現(xiàn)在的可以發(fā)送郵件、語音、視頻,即時通訊還有很大的發(fā)展空間。功能還在不斷完善中以滿足用戶的需求。</p><p>
17、1.3項目研究的內(nèi)容</p><p> 我們的生活需要越來越方便、快捷的通訊工具。最早它主要是作為一種聊天工具,目前其作用早已超出聊天的范疇。盡管當(dāng)前有很多聊天工具,如:QQ、飛信等。這些軟件屬于公共性軟件,安全性難言可靠。盜取用戶賬號進(jìn)行網(wǎng)絡(luò)詐騙和利用各種虛假中獎信息進(jìn)行詐騙的事情屢見不鮮。如果某企事業(yè)單位內(nèi)部為更便捷的交流,特別是當(dāng)涉及較為敏感性話題時,顯然這些軟件還不能夠適應(yīng)這一需求。隨著企業(yè)即時通訊工具
18、的出現(xiàn),即時信息將發(fā)揮更大的作用。為此設(shè)計一個java的即時通訊,以滿足企事業(yè)單位內(nèi)部的需求。</p><p> 2相關(guān)理論及技術(shù)基礎(chǔ)與開發(fā)平臺</p><p> 2.1即時通訊應(yīng)用工作原理分析</p><p> TCP / IP和UDP(用戶數(shù)據(jù)報協(xié)議)是我們平時比較熟知的,都是一種通信運輸協(xié)議,建立在上下級IP協(xié)議。TCP / IP是數(shù)據(jù)流,數(shù)據(jù)的傳輸分割
19、、包裝、通過虛電路建立兩臺機器之間的、雙向的、連續(xù)的、嚴(yán)格保證數(shù)據(jù)的正確性的文件傳輸協(xié)議。而UDP是以數(shù)據(jù)報的形式,對拆分后的數(shù)據(jù)的先后到達(dá)順序不做要求的文件傳輸協(xié)議。我們常見的QQ就是使用UDP協(xié)議進(jìn)行發(fā)送和接收消息的。</p><p><b> 2.2所用技術(shù)</b></p><p> java網(wǎng)絡(luò)編程中有兩種不同的通訊協(xié)議,即TCP與UDP,兩種協(xié)議各有優(yōu)缺
20、點。TCP是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議的傳輸,能夠得到一個順序無差錯的數(shù)據(jù)流。UDP是一種無連接的協(xié)議,每個數(shù)據(jù)報都是一個獨立的信息,在網(wǎng)絡(luò)上它以任何可能的路徑傳往目的地,因此不能被保證能否到達(dá)目的地,也不能保證內(nèi)容的正確性。</p><p> SWING界面設(shè)計:用來實現(xiàn)客服端的界面設(shè)計。Swing是一個用于開發(fā)Java應(yīng)用程序用戶界面的開發(fā)工具包。囊括豐富的控件操作功能以及眾多的控件,
21、使戶可以簡單的利用它結(jié)合JBuilder9.0帶的絕對定位類包,可以設(shè)計出非常好看的用戶界面。</p><p> JSP與SERVLET技術(shù):JSP和SERVLET是在j2ee平臺下開發(fā)的一種WEB應(yīng)用的基礎(chǔ),JSP技術(shù)可以快速開發(fā)出與平臺無關(guān)的基于WEB的應(yīng)用,為建立具有動態(tài)生成內(nèi)容的WEB應(yīng)用提供了一種簡便而且功能強大的途徑,JSP是更高級的SERVLET,在運行的時候JSP先被轉(zhuǎn)化為SERVLET。<
22、;/p><p> 2.3工具及開發(fā)平臺</p><p> 客戶端采用C/S結(jié)構(gòu),管理端采用B/S的結(jié)構(gòu),用Tomcat 作為服務(wù)器,MySQL作為數(shù)據(jù)庫。</p><p> 用過對C/S結(jié)構(gòu)的使用,能充分發(fā)揮客戶端PC的處理能力,使得許多工作能夠在客戶端處理后再提交給服務(wù)器。所對應(yīng)的優(yōu)點就是客戶端響應(yīng)速度快。缺點則有對客戶端的操作系統(tǒng)也會有限制和遠(yuǎn)程訪問需要專門的
23、技術(shù), 這種技術(shù)要求極大的工作量,而且一旦出現(xiàn)問題,整個系統(tǒng)都要進(jìn)行維修。</p><p> SQL SERVER2000數(shù)據(jù)庫具備很多數(shù)據(jù)庫管理常用的功能,是微軟的功能強大的數(shù)據(jù)庫管理系統(tǒng),是一個非常理想的后臺數(shù)據(jù)庫系統(tǒng)。</p><p> Tomcat是一個免費的開源的Serlvet容器,是Sun的JSWDK(JavaServer Web Development Kit)中Serv
24、let的運行環(huán)境。</p><p> 2.4 系統(tǒng)配置要求</p><p> 推薦配置如下:服務(wù)器端要安裝Sql server2000數(shù)據(jù)庫, 服務(wù)器端如果是windowsXP系統(tǒng)要打上Sql server 2000的SP3或者SP4補丁包。服務(wù)器端還需要安裝Web服務(wù)器TOMCAT, myeclipse6.5。運行平臺基于Windows平臺。 客戶端需要安裝java虛擬機。</
25、p><p> 3系統(tǒng)體系結(jié)構(gòu)的設(shè)計</p><p> 3.1 數(shù)據(jù)庫的設(shè)計</p><p> 本系統(tǒng)中所涉及的主要實體及其屬性有:</p><p> 用戶(用戶賬號,用戶名,密碼,個性簽名,頭像ID,年齡,性別) </p><p> E-R模型如圖所示。</p><p> 圖 3-1系統(tǒng)
26、實體及其屬性</p><p><b> 表3-1 User</b></p><p><b> 3.2系統(tǒng)模塊設(shè)計</b></p><p> 3.2.1聊天系統(tǒng)工作原理圖</p><p> 圖 3-2 系統(tǒng)工作原理</p><p> 3.2.2系統(tǒng)功能模塊圖:<
27、/p><p> 圖 3-3 系統(tǒng)模塊</p><p> 圖 3-4 普通用戶用例圖</p><p> 后臺管理員的用例圖:</p><p> 圖 3-5 后臺用戶用例圖</p><p><b> 3.2.3活動圖:</b></p><p><b> 1)用
28、戶登陸活動圖</b></p><p> 首先填寫登陸信息,提交以后服務(wù)器會對用戶名和密碼進(jìn)行驗證。如果不正確,返回一個提示信息。如果登陸成功,就更新在線狀態(tài)。通知所有好友自己已經(jīng)上線。服務(wù)器再檢查是否有他的離線消息,如果有這立即發(fā)送給用戶。</p><p> 圖 3-6 用戶登錄活動圖</p><p><b> 2)發(fā)送消息活動圖<
29、/b></p><p> 短消息發(fā)送以后,服務(wù)器端對應(yīng)的監(jiān)聽線程會接收到一個數(shù)據(jù)包。此包中包含接收者的信息,如果接收者在線,數(shù)據(jù)包將會轉(zhuǎn)發(fā)到接收者。如果不在線,存在服務(wù)器端,等它上線在發(fā)送。</p><p> 圖 3-7發(fā)送消息活動圖</p><p> 3.3系統(tǒng)類設(shè)計 </p><p> 3.3.1 Message類的設(shè)計:
30、</p><p> 客戶端和服務(wù)器端通信時,發(fā)送的都是Message類的對象,因此Message類的設(shè)計很重要。</p><p> 表4-2 Message</p><p> private Integer msgType消息的類型有這么幾種:</p><p> public interface MessageType {</p
31、><p> Integer message_succeed=1;//表明是登陸成功</p><p> Integer message_login_fail=2;//表明登錄失敗</p><p> Integer message_comm_mes=3;//普通信息包</p><p> Integer message_get_onLineFr
32、iend=4;//要求在線好友的包</p><p> Integer message_ret_onLineFriend=5;//返回在線好友的包</p><p> Integer message_offline=6;//下線通知包</p><p> Integer message_img=7;//圖片包</p><p> Intege
33、r message_file=8;//文件包</p><p><b> }</b></p><p> 3.3.2服務(wù)端線程的設(shè)計:</p><p> 服務(wù)器端的核心是對應(yīng)客戶的線程,每個socket對應(yīng)一個線程,也就是每一個客戶端都在服務(wù)器端有一個相應(yīng)的線程。它負(fù)責(zé)轉(zhuǎn)發(fā)客戶端發(fā)來的消息。線程類為ClientThread:</p>
34、;<p> 表4-3 ClientThread類</p><p><b> 4系統(tǒng)實現(xiàn)</b></p><p><b> 4.1 實現(xiàn)概況</b></p><p> 本系統(tǒng)可分為登錄、聊天、文件、用戶管理和注冊五個功能模塊。“登錄”模塊為用戶提供登錄界面,并在用戶登錄顯示好友列表;“聊天”模塊實現(xiàn)用戶
35、的即時傳送信息,即多用戶即時聊天,可以發(fā)送文字或者截圖;“文件”模塊主要實現(xiàn)一用戶向另一用戶發(fā)送文件,對方可以選擇接受或者拒絕。聊天記錄會以文本文檔格式保存。“用戶管理”模塊即管理員對用戶進(jìn)行增刪改查,和踢用戶下線的操作。</p><p> 下面詳細(xì)介紹各個模塊的具體實現(xiàn)。</p><p><b> 4.2 注冊模塊</b></p><p>
36、;<b> 4.2.1 流程圖</b></p><p> 圖4-1用戶注冊流程圖</p><p> 4.2.2 關(guān)鍵代碼</p><p> 注冊的前臺頁面是showDetail.jsp,后臺是UserAction類,UserAction類中有方法:</p><p> public String saveOrUp
37、date(){</p><p> us.saveOrUpdate(user);</p><p> return "refresh";</p><p><b> }</b></p><p> saveOrUpdate則是用到了Userservice里面的方法:</p><p&
38、gt; public void saveOrUpdate(User u){</p><p> System.out.println("u.getAccount()="+u.getAccount());</p><p> if(u.getAccount()==null)</p><p> ud.save(u);</p><
39、;p> else ud.update(u);</p><p><b> }</b></p><p><b> DAO類中的方法:</b></p><p> public void save(User u){</p><p> conn=getConnection();</p&g
40、t;<p><b> try {</b></p><p> ps=conn.prepareStatement(SAVE);</p><p> ps.setString(1, u.getName());</p><p> ps.setString(2, u.getPassword());</p><p&g
41、t; ps.setString(3, u.getSignature());</p><p> ps.setInt(4, 1);</p><p> ps.setInt(5, u.getAge());</p><p> ps.setString(6, u.getSex());</p><p> ps.execute();</p&g
42、t;<p> } catch (SQLException e) {</p><p> // TODO Auto-generated catch block</p><p> e.printStackTrace();</p><p><b> }finally{</b></p><p><b&g
43、t; close();</b></p><p><b> } </b></p><p><b> }</b></p><p> 網(wǎng)頁上顯示用戶的account</p><p> 圖 4-2 用戶注冊信息</p><p><b> 4.
44、3 登錄模塊</b></p><p><b> 4.3.1 流程圖</b></p><p> 圖 4-3 登錄流程圖</p><p> 4.3.2 關(guān)鍵代碼</p><p><b> 1)客戶端代碼</b></p><p> 登錄事件是定義在clas
45、s IMClientLogin extends JFrame 這個類的監(jiān)聽事件中。登錄成功后,立即向服務(wù)器請求自己的好友列表。</p><p><b> //登錄事件</b></p><p> login.addActionListener(new ActionListener() {</p><p> public void actio
46、nPerformed(ActionEvent e) {</p><p> //cus=new IMClientUserServer();</p><p> //System.out.println(cus.getServer());</p><p> User u=new User();</p><p> u.setA
47、ccount(Integer.parseInt(account.getText().trim()));</p><p> u.setPassword(new String(passwordField.getPassword()));</p><p> //登陸成功</p><p> if(cus.checkLogin(u)){</p>&
48、lt;p> //向服務(wù)器發(fā)送數(shù)據(jù)包,請求在線人得信息</p><p> ClientConnToServerThread t=Manager.THREAD;</p><p> Message m=new Message();</p><p> m.setMsgType(MessageType.message_get_onLineFriend);<
49、;/p><p> m.setSenderAccount(u.getAccount());</p><p><b> try {</b></p><p> t.send(m);</p><p> } catch (IOException e1) {</p><p> e1.printStack
50、Trace();</p><p><b> }</b></p><p> dispose();</p><p><b> }</b></p><p><b> else</b></p><p> JOptionPane.showMess
51、ageDialog(null, "用戶名或密碼錯誤", "錯誤", JOptionPane.ERROR_MESSAGE);</p><p><b> }</b></p><p><b> });</b></p><p> 登錄邏輯是在public class IMClientU
52、serServer 里面,認(rèn)證成功者就會新建一個線程,專門負(fù)責(zé)接收服務(wù)器端發(fā)來的信息class ClientConnToServerThread extends Thread 。</p><p> public boolean checkLogin(Object o) {</p><p> boolean success=false;</p><p> Mes
53、sage msg=(Message) server.sendLoginInfo(o);</p><p> //System.out.println(msg.getMsgType());</p><p> //System.out.println(MessageType.message_succeed);</p><p> if(msg.getMsgTy
54、pe().intValue()==MessageType.message_succeed.intValue()){</p><p> success=true;</p><p> User u=(User) o;</p><p> //將好友列表放到管理器中,進(jìn)行上下線操作</p><p> IMFriendList fl=new
55、IMFriendList(msg.getMyself(),msg.getFriends());</p><p> Manager.FRIEND_LIST=fl;</p><p> //開啟客戶線程 ,接收服務(wù)器端的信息</p><p> connThread =new ClientConnToServerThread(server.getSocket());&
56、lt;/p><p> connThread.setSocket(server.getSocket());</p><p> connThread.start();</p><p> connThread.setName(u.getAccount()+"");</p><p> Manager.THREAD=connTh
57、read;</p><p><b> }</b></p><p> return success;</p><p><b> }</b></p><p> 客戶端通過public class IMClientServer 類與服務(wù)器通信</p><p> publi
58、c Object sendLoginInfo(Object o) {</p><p><b> try {</b></p><p> ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());</p><p> oos.writeObject(o);
59、</p><p> ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());</p><p> Message ms = (Message) ois.readObject();</p><p> return ms;</p><p> } catch
60、 (IOException e) {</p><p> e.printStackTrace();</p><p> } catch (ClassNotFoundException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p>&l
61、t;p> return null;</p><p><b> }</b></p><p> 這樣按照MVC的模式設(shè)計,減小的系統(tǒng)耦合。</p><p><b> 2)服務(wù)端代碼</b></p><p> 服務(wù)器端接收用戶驗證信息的代碼被寫在了一個線程public class Serv
62、erThread extends Thread中,這樣服務(wù)器就可以不停的監(jiān)聽端口,接收來自不同客戶端的請求,建立socket連接,也不會堵塞在主線程當(dāng)中。</p><p> 從數(shù)據(jù)庫中搜索用戶,看是否存在</p><p> public boolean checkLogin(User u){</p><p> User user=ud.findById(u.g
63、etAccount());</p><p> if(user!=null){</p><p> return user.getPassword().equals(u.getPassword());</p><p><b> }</b></p><p> return false;</p><p
64、><b> }</b></p><p> 如果驗證成功,查找是否有他的離線消息,有就發(fā)送給他。然后在服務(wù)器上專門開啟一個針對當(dāng)前用戶的線程,并且吧線程放入管理類中,便于日后的管理。</p><p> if (checkLogin(u)) {</p><p> // 返回一個成功登陸的信息報</p><p>
65、 User myself=ud.findById(u.getAccount());</p><p> m.setMsgType(MessageType.message_succeed);</p><p> m.setMyself(myself);</p><p> m.setFriends(ud.findAll());//好友列表</p>&l
66、t;p> oos.writeObject(m);</p><p> //為用戶單獨創(chuàng)建線程</p><p> ClientThread t=new ClientThread(s);</p><p> //查看是否有離線消息</p><p> LinkedList<Message> list=OffLineMsgMa
67、nager.get(u.getAccount());</p><p> if(list!=null){</p><p> for(Message msg:list){</p><p> t.send(msg);</p><p><b> }</b></p><p> list.clear
68、();</p><p><b> }</b></p><p><b> //開啟線程</b></p><p> t.start();</p><p> t.setName(u.getAccount()+"");</p><p> //把用戶線程放
69、入管理類中</p><p> ClientThreadManager.addClientThread(u.getAccount(), t);</p><p><b> //通知其他的用戶</b></p><p> t.notifyOnline();</p><p> System.out.println(&quo
70、t; 成功");</p><p><b> } else {</b></p><p> m.setMsgType(3);</p><p> oos.writeObject(m);</p><p> System.out.println(" 失敗");</p><
71、;p> // 關(guān)閉Socket</p><p> s.close();</p><p><b> }</b></p><p><b> 4.4 聊天模塊</b></p><p><b> 4.4.1 流程圖</b></p><p> 圖
72、 4-4 聊天流程圖</p><p> 4.4.2 關(guān)鍵代碼</p><p><b> 1)客服端代碼</b></p><p><b> 發(fā)送文字信息:</b></p><p> 客戶端發(fā)送和顯示信息的代碼被封裝在了IMChat extends JFrame implements Acti
73、onListener類中,其中發(fā)送文字信息的代碼</p><p> //點擊的如果是發(fā)送button</p><p> if (e.getSource() == confirmButton) {</p><p> Message m=(Message) makePackage(MessageType.message_comm_mes,null);</p&
74、gt;<p><b> //發(fā)送</b></p><p> sendMessage(m);</p><p> //在自己的Ouput上顯示</p><p> showMessage(m,Color.BLACK);</p><p><b> //清空輸入</b></p&g
75、t;<p> input_textArea.setText("");</p><p><b> }</b></p><p> 當(dāng)用戶點擊發(fā)送按鈕后,先把先把信息顯示在自己的聊天窗口上,后方發(fā)送信息,自己發(fā)送的信息和接收到的信息用不同的顏色顯示。</p><p> 顯示文字信息,顯示在JtextPane控
76、件中 </p><p> SimpleAttributeSet attrset = new SimpleAttributeSet();</p><p> StyleConstants.setForeground(attrset,c);</p><p> Document docs = output_pane.getDocument();</p>
77、<p> // 利用getDocument()方法取得JTextPane的Document</p><p><b> //一般信息</b></p><p> if(m.getMsgType().intValue()==MessageType.message_comm_mes){</p><p> String str=m.
78、getSenderAccount() + " " +m.getTime()+"\n"+" "+ m.getContent()+ "\n";</p><p><b> try {</b></p><p> docs.insertString(docs.getLength(), s
79、tr, attrset);</p><p><b> //設(shè)置光標(biāo)到末尾</b></p><p> output_pane.setCaretPosition(docs.getLength());</p><p> } catch (BadLocationException e) {</p><p> e.prin
80、tStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> 發(fā)送圖片信息:</b></p><p> 在發(fā)送圖片信息的時候,先將圖片轉(zhuǎn)換成為byte[]數(shù)組,包裝在信息包種發(fā)送出去,接收到圖片信息時
81、,從byte[]數(shù)組構(gòu)建圖片,顯示出來。</p><p> 圖片和byte[]之間相互轉(zhuǎn)換的關(guān)鍵代碼如下:</p><p> //將image轉(zhuǎn)換成 byte[]</p><p> public byte[] imageToBytes(Image img){</p><p> ByteArrayOutputStream bos=new
82、 ByteArrayOutputStream();</p><p><b> try {</b></p><p> ImageIO.write((RenderedImage) img, "jpg", bos);</p><p> } catch (IOException e) {</p><p>
83、; e.printStackTrace();</p><p><b> }</b></p><p> return bos.toByteArray();</p><p><b> }</b></p><p> //將 byte[]轉(zhuǎn)換成image</p><p>
84、 public Image bytesToImage(byte[] b){</p><p><b> try {</b></p><p> return ImageIO.read(new ByteArrayInputStream(b));</p><p> } catch (IOException e) {</p><
85、;p> e.printStackTrace();</p><p><b> }</b></p><p> return null;</p><p><b> }</b></p><p> 在JtextPane中顯示圖片的代碼:</p><p> if(m.g
86、etMsgType().intValue()==MessageType.message_img){</p><p><b> //圖片信息</b></p><p> String str=m.getSenderAccount() + " " +m.getTime()+ "\n";</p><p>&l
87、t;b> try {</b></p><p> //顯示發(fā)送人 和時間</p><p> docs.insertString(docs.getLength(), str, attrset);</p><p><b> //設(shè)置光標(biāo)到末尾</b></p><p> output_pane.set
88、CaretPosition(docs.getLength());</p><p> output_pane.insertIcon(new ImageIcon(m.getImg()));</p><p> docs.insertString(docs.getLength(), "\n", attrset);</p><p><b>
89、 //設(shè)置光標(biāo)到末尾</b></p><p> output_pane.setCaretPosition(docs.getLength());</p><p> } catch (BadLocationException e) {</p><p> e.printStackTrace();</p><p><b>
90、 }</b></p><p><b> }</b></p><p> 在客戶端顯示截圖示例:</p><p> 圖 4-5 聊天截圖</p><p><b> 2)服務(wù)端代碼</b></p><p> 服務(wù)端接收到客戶端的信息后,只需要根據(jù)他的接收人
91、,進(jìn)行轉(zhuǎn)發(fā)就可以。關(guān)鍵代碼如下:</p><p> Message m = (Message) receive();</p><p> // 如果是普通信息</p><p> if (m.getMsgType() == MessageType.message_comm_mes.intValue()) {</p><p> System
92、.out.println(m.getSenderAccount() + "send to"+ m.getReceiverAccount() + "at" + m.getTime());</p><p> Integer receiverAccount = m.getReceiverAccount();</p><p> ClientThread
93、t = ClientThreadManager.getClientThread(receiverAccount);</p><p> if (t == null) {</p><p> //不在線就暫時存儲在服務(wù)器上</p><p> OffLineMsgManager.putSingle(receiverAccount, m);</p><
94、;p><b> } else</b></p><p> t.send(m);</p><p><b> 4.5 文件模塊</b></p><p><b> 4.5.1 流程圖</b></p><p> 圖 4-6 發(fā)送文件流程圖</p><
95、p> 4.5.2 關(guān)鍵代碼</p><p><b> 1)客戶端代碼</b></p><p> 在客戶端采用JfileChooser來瀏覽本地文件,點擊瀏覽按鈕后,會彈出對話框,讓用戶選擇文件,然后將文件名,大小等信息封裝在數(shù)據(jù)包里,發(fā)送出去。關(guān)鍵代碼如下:</p><p><b> @Override</b>
96、;</p><p> public void mouseClicked(MouseEvent e) {</p><p> fileDialog.setDialogTitle("選擇文件");</p><p> fileDialog.showOpenDialog(IMChat.this);</p><p><b
97、> //只能選中文件</b></p><p> fileDialog.setFileSelectionMode(JFileChooser.FILES_ONLY);</p><p> f=fileDialog.getSelectedFile();</p><p> //發(fā)送數(shù)據(jù)包,請求發(fā)送文件</p><p> Me
98、ssage m = new Message();</p><p> m.setMsgType(MessageType.message_file);</p><p> m.setSenderAccount(ownerId);</p><p> m.setReceiverAccount(Integer.parseInt(hideButton.getText())
99、);</p><p> SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//發(fā)送時間</p><p> m.setTime(s.format(new java.util.Date()));</p><p> m.setFileName(f.getName())
100、;//文件名</p><p> m.setState(2);//請求發(fā)送文件</p><p> int length=(int) (f.length()/1000);</p><p> m.setLength(length);//文件大小</p><p> sendMessage(m);</p><p><
101、;b> }</b></p><p> 對方會顯示提示信息:</p><p> 圖 4-7 詢問接收文件圖</p><p> 如果對方同意接收則開啟線程。因為文件可能比較大,所以不能一次性發(fā)送,只能用線程分批發(fā)送。線程關(guān)鍵代碼如下:</p><p><b> 正常發(fā)送文件:</b></
102、p><p> 圖 4-8 文件傳輸圖</p><p><b> @Override</b></p><p> public void run() {</p><p><b> try {</b></p><p><b> int num ;</b>
103、;</p><p> //bar.setStringPainted(true);</p><p> JProgressBar bar=chat.getProgressBar();</p><p> m.setMsgType(MessageType.message_file);</p><p> m.setFileName(f.g
104、etName());</p><p> BufferedInputStream bos=new BufferedInputStream(new FileInputStream(f));</p><p> while((num = bos.read(b)) != -1){</p><p> m.setFileByte(b);</p><p&g
105、t; Manager.THREAD.send(m);</p><p> int value=LENGTH/10000;</p><p> bar.setValue(bar.getValue()+value);</p><p><b> }</b></p><p> bar.setVisible(false);&
106、lt;/p><p> //bar.setValue(0);</p><p><b> //發(fā)送完畢</b></p><p> SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");</p><p> m.setTim
107、e(s.format(new java.util.Date()));</p><p> m.setState(4);</p><p> Manager.THREAD.send(m);</p><p> //在窗口上顯示發(fā)送成功</p><p> chat.append(new Color(0,0,255), "文件"
108、;+f.getName()+"(" +f.length()/1000000+"M)"+"發(fā)送成功"+"\n");</p><p> } catch (FileNotFoundException e) {</p><p> // TODO Auto-generated catch block</p>
109、;<p> e.printStackTrace();</p><p> } catch (IOException e) {</p><p> // TODO Auto-generated catch block</p><p> e.printStackTrace();</p><p><b> }</
110、b></p><p><b> }</b></p><p> 發(fā)送完成后,雙方的界面上都會顯示成功信息:</p><p> 圖 4-9 文件傳輸成功圖</p><p> 客戶端接收文件的邏輯:</p><p> 文件的傳輸狀態(tài)被定義成了這幾種:</p><p&
111、gt;<b> 0是不接受文件,</b></p><p><b> 1是接受文件,</b></p><p><b> 2請求發(fā)送文件,</b></p><p><b> 3文件傳輸中,</b></p><p><b> 4文件傳送完成&
112、lt;/b></p><p> 客戶端接收文件是可根據(jù)這些狀態(tài),進(jìn)行操作,關(guān)鍵代碼如下:</p><p><b> //請求發(fā)送包</b></p><p> if(m.getState()==2){ </p><p> //對話框 是否接收</p><p> int i=JO
113、ptionPane.showConfirmDialog(chat, "確定接收" +</p><p> m.getFileName()+"(" +m.getLength()+"KB)", "接收文件",JOptionPane.YES_NO_OPTION);</p><p> Integer sender=m
114、.getReceiverAccount();</p><p> Integer getter=m.getSenderAccount();</p><p> m.setSenderAccount(sender);</p><p> m.setReceiverAccount(getter);</p><p> //同意就發(fā)送同意接收數(shù)據(jù)包
115、</p><p> if(i==JOptionPane.YES_OPTION){</p><p> //打開保存文件對話框</p><p> JFileChooser jfc=new JFileChooser("c:/");</p><p> jfc.setFileSelectionMode(JFileChoose
116、r.DIRECTORIES_ONLY);</p><p> int mod=jfc.showSaveDialog(chat);</p><p> if(mod==JFileChooser.APPROVE_OPTION){</p><p><b> //如果選擇了路徑</b></p><p> File f=jfc
117、.getSelectedFile();</p><p> f=new File(f.getAbsolutePath()+"/"+m.getFileName());</p><p> bos=new BufferedOutputStream(new FileOutputStream(f));</p><p> m.setState(1);&l
118、t;/p><p><b> send(m);</b></p><p><b> }else{</b></p><p> //選擇了取消或關(guān)閉對話框</p><p> m.setState(0);</p><p><b> send(m);</b>&
119、lt;/p><p><b> }</b></p><p><b> }else{</b></p><p> m.setState(0);</p><p><b> send(m);</b></p><p><b> }</b>
120、</p><p> }else if(m.getState()==3){</p><p><b> //正在傳輸包</b></p><p> byte b[]=m.getFileByte();</p><p><b> //設(shè)置進(jìn)度條</b></p><p> ch
121、at.getProgressBar().setVisible(true);</p><p> chat.getProgressBar().setMaximum(m.getLength()/10);</p><p> chat.getProgressBar().setMinimum(0);</p><p> bos.write(b);</p>&l
122、t;p> }else if (m.getState()==0){</p><p><b> //不同意發(fā)送</b></p><p> JOptionPane.showMessageDialog(chat, "對方拒絕接收文件", "通知", JOptionPane.WARNING_MESSAGE);</p>
123、;<p> }else if (m.getState()==1){</p><p><b> //同意發(fā)送</b></p><p> System.out.println("同意發(fā)送");</p><p> chat.SendFile();</p><p> }else if(
124、m.getState()==4){</p><p> System.out.println(m.getFileName()+"傳輸完成");</p><p> chat.getProgressBar().setVisible(false);</p><p> chat.append(new Color(0,0,255), "文件&
125、quot;+m.getFileName()+"(" +m.getLength()/1000+"M)"+"接收完成"+"\n");</p><p><b> }</b></p><p><b> 2)服務(wù)器端代碼:</b></p><p>
126、 服務(wù)端只負(fù)責(zé)轉(zhuǎn)發(fā),關(guān)鍵代碼如下:</p><p> else if(m.getMsgType()==MessageType.message_file.intValue()){</p><p> Integer receiverAccount=m.getReceiverAccount();</p><p> ClientThread t=ClientThre
127、adManager.getClientThread(receiverAccount);</p><p> t.send(m);</p><p><b> }</b></p><p> 4.6 用戶管理模塊</p><p><b> 4.6.1 流程圖</b></p><p
128、> 圖 4-10 web用戶登錄圖</p><p> 4.6.2 關(guān)鍵代碼</p><p> 用戶管理的前臺頁面是jsp頁面, 在頁面中可以對用戶進(jìn)行增刪改查。</p><p> 圖 4-11 用戶管理圖</p><p> 關(guān)鍵代碼如下:以頁數(shù)列出用戶</p><p> public List&
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于java的即時通訊軟件設(shè)計與實現(xiàn)
- 基于Java的即時通訊系統(tǒng)的設(shè)計與實現(xiàn).pdf
- 基于Java的即時通訊軟件的設(shè)計與實現(xiàn).pdf
- 基于java的即時通訊系統(tǒng)設(shè)計與實現(xiàn)【文獻(xiàn)綜述】
- 基于java的即時通訊系統(tǒng)設(shè)計與實現(xiàn)【開題報告】
- 基于Java的網(wǎng)絡(luò)即時通訊系統(tǒng)的設(shè)計與實現(xiàn).pdf
- 基于java的網(wǎng)絡(luò)即時通訊軟件的設(shè)計和實現(xiàn)
- 企業(yè)即時通訊軟件的設(shè)計與開發(fā).pdf
- 基于java的android即時通訊軟件畢業(yè)論文
- 即時通訊畢業(yè)設(shè)計--企業(yè)內(nèi)部即時通訊系統(tǒng)的設(shè)計
- 校園即時通訊設(shè)計與開發(fā)課程設(shè)計
- 基于Internet的即時通訊軟件的研究與開發(fā).pdf
- 基于mfc的即時通訊軟件的設(shè)計與實現(xiàn)
- java一個簡單的即時通訊工具的設(shè)計與開發(fā)(源代碼+論文)
- 基于Android即時通訊系統(tǒng)的設(shè)計與實現(xiàn).pdf
- 學(xué)術(shù)即時通訊mathq
- 安卓即時通訊
- 基于AVS的即時通訊系統(tǒng)的設(shè)計與實現(xiàn).pdf
- 即時通訊軟件的設(shè)計2論文
- 基于WPF的即時通訊系統(tǒng)的設(shè)計與實現(xiàn).pdf
評論
0/150
提交評論