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

下載本文檔

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

文檔簡介

1、<p>  密 級 公 開 學(xué) 號 </p><p><b>  XX學(xué)院</b></p><p><b>  畢業(yè)設(shè)計(jì)</b></p><p>  基于JAVA的即時(shí)通訊的設(shè)計(jì)與開發(fā)</p><p>

2、;  基于JAVA的即時(shí)通訊的設(shè)計(jì)與開發(fā)</p><p>  摘 要:即時(shí)通訊(Instant Messenger),是一種基于互聯(lián)網(wǎng)的即時(shí)交流消息的業(yè)務(wù),所常見的有: MSN、QQ、UC等。這些都具有很強(qiáng)的商業(yè)化特點(diǎn)。在現(xiàn)有網(wǎng)絡(luò)基礎(chǔ)上,研究一個(gè)安全的、私有的、本地或本部門化的即時(shí)通訊工具,非常有必要。Java是我們當(dāng)前所使用的比較流行的開發(fā)語言,它有著自己簡單易用的特點(diǎn)與性能優(yōu)勢(比如跨平臺、安全性、多線程、

3、網(wǎng)絡(luò)Socket編程、數(shù)據(jù)流概念)。通過對即時(shí)通訊工具的需求、體系結(jié)構(gòu)、構(gòu)成模塊等的分析和研究,采用java語言和eclipse為基本開發(fā)環(huán)境,應(yīng)用重構(gòu)開發(fā)方法,優(yōu)化了系統(tǒng)設(shè)計(jì),利用局域網(wǎng)通信機(jī)制的原理(即通過直接繼承Thread類來建立多線程),實(shí)現(xiàn)了網(wǎng)絡(luò)聊天服務(wù)器程序和網(wǎng)絡(luò)聊天客戶程序。前者通過Socket套接字建立服務(wù)器,使得服務(wù)器能讀取并且轉(zhuǎn)發(fā)客戶端發(fā)來信息,同時(shí)還能刷新用戶列表。后者通過與服務(wù)器建立連接,能夠?qū)崿F(xiàn)客戶端與客戶端

4、的信息交流。</p><p>  關(guān)鍵詞:即時(shí)通訊;多線程;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項(xiàng)目開發(fā)的背景1</p><p><b>  1.2研究現(xiàn)狀1</b></p><p>  1.3項(xiàng)目研究的內(nèi)容1</p><p>  2相關(guān)理論及技術(shù)基礎(chǔ)與開發(fā)平臺

9、2</p><p>  2.1即時(shí)通訊應(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è)計(jì)4</p><p>  

10、3.1 數(shù)據(jù)庫的設(shè)計(jì)4</p><p>  3.2系統(tǒng)模塊設(shè)計(jì)4</p><p>  3.2.1系統(tǒng)功能模塊圖:5</p><p>  3.3系統(tǒng)類設(shè)計(jì)8</p><p><b>  4系統(tǒng)實(shí)現(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è)計(jì)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項(xiàng)目開發(fā)的背景</p><p>  我們的生活需要越來越方便、快捷的通訊工具。盡管當(dāng)前有一些類似的工具,如:QQ、飛信等。這些軟件屬于公共性軟件,安全性難言可靠。盜取用戶賬號進(jìn)行網(wǎng)絡(luò)詐騙和利用各種虛假中獎(jiǎng)信息進(jìn)行詐騙的事情屢見不鮮。如果某企事業(yè)單位內(nèi)部為更便捷的交流,特別是

15、當(dāng)涉及較為敏感性話題時(shí),顯然這些軟件還不能夠適應(yīng)這一需求。為此設(shè)計(jì)一個(gè)java的即時(shí)通訊。本系統(tǒng)包括服務(wù)器端和客戶端,可以在企業(yè)內(nèi)部網(wǎng)絡(luò)和互聯(lián)網(wǎng)上運(yùn)行(主要是在企業(yè)內(nèi)部)。同時(shí)本系統(tǒng)具有Java應(yīng)用的跨平臺特性,方便運(yùn)行在各個(gè)系統(tǒng)之上。同時(shí)它具有比較漂亮的界面,與常用的qq有許多類似于功能(比如可以和好友進(jìn)行在線交流、添加刪除好友、即時(shí)發(fā)送、即時(shí)回復(fù)等功能)。</p><p><b>  1.2研究現(xiàn)狀

16、</b></p><p>  隨著互聯(lián)網(wǎng)得迅速發(fā)展,上網(wǎng)聊天已經(jīng)成為人們生活中不可或缺的一部分,即時(shí)通訊也在不斷更新發(fā)展。從最早的ICQ( I seek you)橫空問世到現(xiàn)在的qq、msn等風(fēng)靡全球,即時(shí)通訊也不過才走過了17個(gè)年頭。功能從最早的只能發(fā)送文字到現(xiàn)在的可以發(fā)送郵件、語音、視頻,即時(shí)通訊還有很大的發(fā)展空間。功能還在不斷完善中以滿足用戶的需求。</p><p>  

17、1.3項(xiàng)目研究的內(nèi)容</p><p>  我們的生活需要越來越方便、快捷的通訊工具。最早它主要是作為一種聊天工具,目前其作用早已超出聊天的范疇。盡管當(dāng)前有很多聊天工具,如:QQ、飛信等。這些軟件屬于公共性軟件,安全性難言可靠。盜取用戶賬號進(jìn)行網(wǎng)絡(luò)詐騙和利用各種虛假中獎(jiǎng)信息進(jìn)行詐騙的事情屢見不鮮。如果某企事業(yè)單位內(nèi)部為更便捷的交流,特別是當(dāng)涉及較為敏感性話題時(shí),顯然這些軟件還不能夠適應(yīng)這一需求。隨著企業(yè)即時(shí)通訊工具

18、的出現(xiàn),即時(shí)信息將發(fā)揮更大的作用。為此設(shè)計(jì)一個(gè)java的即時(shí)通訊,以滿足企事業(yè)單位內(nèi)部的需求。</p><p>  2相關(guān)理論及技術(shù)基礎(chǔ)與開發(fā)平臺</p><p>  2.1即時(shí)通訊應(yīng)用工作原理分析</p><p>  TCP / IP和UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是我們平時(shí)比較熟知的,都是一種通信運(yùn)輸協(xié)議,建立在上下級IP協(xié)議。TCP / IP是數(shù)據(jù)流,數(shù)據(jù)的傳輸分割

19、、包裝、通過虛電路建立兩臺機(jī)器之間的、雙向的、連續(xù)的、嚴(yán)格保證數(shù)據(jù)的正確性的文件傳輸協(xié)議。而UDP是以數(shù)據(jù)報(bào)的形式,對拆分后的數(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、點(diǎn)。TCP是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議的傳輸,能夠得到一個(gè)順序無差錯(cuò)的數(shù)據(jù)流。UDP是一種無連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,在網(wǎng)絡(luò)上它以任何可能的路徑傳往目的地,因此不能被保證能否到達(dá)目的地,也不能保證內(nèi)容的正確性。</p><p>  SWING界面設(shè)計(jì):用來實(shí)現(xiàn)客服端的界面設(shè)計(jì)。Swing是一個(gè)用于開發(fā)Java應(yīng)用程序用戶界面的開發(fā)工具包。囊括豐富的控件操作功能以及眾多的控件,

21、使戶可以簡單的利用它結(jié)合JBuilder9.0帶的絕對定位類包,可以設(shè)計(jì)出非常好看的用戶界面。</p><p>  JSP與SERVLET技術(shù):JSP和SERVLET是在j2ee平臺下開發(fā)的一種WEB應(yīng)用的基礎(chǔ),JSP技術(shù)可以快速開發(fā)出與平臺無關(guān)的基于WEB的應(yīng)用,為建立具有動(dòng)態(tài)生成內(nèi)容的WEB應(yīng)用提供了一種簡便而且功能強(qiáng)大的途徑,JSP是更高級的SERVLET,在運(yùn)行的時(shí)候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)點(diǎn)就是客戶端響應(yīng)速度快。缺點(diǎn)則有對客戶端的操作系統(tǒng)也會(huì)有限制和遠(yuǎn)程訪問需要專門的

23、技術(shù), 這種技術(shù)要求極大的工作量,而且一旦出現(xiàn)問題,整個(gè)系統(tǒng)都要進(jìn)行維修。</p><p>  SQL SERVER2000數(shù)據(jù)庫具備很多數(shù)據(jù)庫管理常用的功能,是微軟的功能強(qiáng)大的數(shù)據(jù)庫管理系統(tǒng),是一個(gè)非常理想的后臺數(shù)據(jù)庫系統(tǒng)。</p><p>  Tomcat是一個(gè)免費(fèi)的開源的Serlvet容器,是Sun的JSWDK(JavaServer Web Development Kit)中Serv

24、let的運(yùn)行環(huán)境。</p><p>  2.4 系統(tǒng)配置要求</p><p>  推薦配置如下:服務(wù)器端要安裝Sql server2000數(shù)據(jù)庫, 服務(wù)器端如果是windowsXP系統(tǒng)要打上Sql server 2000的SP3或者SP4補(bǔ)丁包。服務(wù)器端還需要安裝Web服務(wù)器TOMCAT, myeclipse6.5。運(yùn)行平臺基于Windows平臺。 客戶端需要安裝java虛擬機(jī)。</

25、p><p>  3系統(tǒng)體系結(jié)構(gòu)的設(shè)計(jì)</p><p>  3.1 數(shù)據(jù)庫的設(shè)計(jì)</p><p>  本系統(tǒng)中所涉及的主要實(shí)體及其屬性有:</p><p>  用戶(用戶賬號,用戶名,密碼,個(gè)性簽名,頭像ID,年齡,性別) </p><p>  E-R模型如圖所示。</p><p>  圖 3-1系統(tǒng)

26、實(shí)體及其屬性</p><p><b>  表3-1 User</b></p><p><b>  3.2系統(tǒng)模塊設(shè)計(jì)</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活動(dòng)圖:</b></p><p><b>  1)用

28、戶登陸活動(dòng)圖</b></p><p>  首先填寫登陸信息,提交以后服務(wù)器會(huì)對用戶名和密碼進(jìn)行驗(yàn)證。如果不正確,返回一個(gè)提示信息。如果登陸成功,就更新在線狀態(tài)。通知所有好友自己已經(jīng)上線。服務(wù)器再檢查是否有他的離線消息,如果有這立即發(fā)送給用戶。</p><p>  圖 3-6 用戶登錄活動(dòng)圖</p><p><b>  2)發(fā)送消息活動(dòng)圖<

29、/b></p><p>  短消息發(fā)送以后,服務(wù)器端對應(yīng)的監(jiān)聽線程會(huì)接收到一個(gè)數(shù)據(jù)包。此包中包含接收者的信息,如果接收者在線,數(shù)據(jù)包將會(huì)轉(zhuǎn)發(fā)到接收者。如果不在線,存在服務(wù)器端,等它上線在發(fā)送。</p><p>  圖 3-7發(fā)送消息活動(dòng)圖</p><p>  3.3系統(tǒng)類設(shè)計(jì) </p><p>  3.3.1 Message類的設(shè)計(jì):

30、</p><p>  客戶端和服務(wù)器端通信時(shí),發(fā)送的都是Message類的對象,因此Message類的設(shè)計(jì)很重要。</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è)計(jì):</p><p>  服務(wù)器端的核心是對應(yīng)客戶的線程,每個(gè)socket對應(yīng)一個(gè)線程,也就是每一個(gè)客戶端都在服務(wù)器端有一個(gè)相應(yīng)的線程。它負(fù)責(zé)轉(zhuǎn)發(fā)客戶端發(fā)來的消息。線程類為ClientThread:</p>

34、;<p>  表4-3 ClientThread類</p><p><b>  4系統(tǒng)實(shí)現(xiàn)</b></p><p><b>  4.1 實(shí)現(xiàn)概況</b></p><p>  本系統(tǒng)可分為登錄、聊天、文件、用戶管理和注冊五個(gè)功能模塊?!暗卿洝蹦K為用戶提供登錄界面,并在用戶登錄顯示好友列表;“聊天”模塊實(shí)現(xiàn)用戶

35、的即時(shí)傳送信息,即多用戶即時(shí)聊天,可以發(fā)送文字或者截圖;“文件”模塊主要實(shí)現(xiàn)一用戶向另一用戶發(fā)送文件,對方可以選擇接受或者拒絕。聊天記錄會(huì)以文本文檔格式保存。“用戶管理”模塊即管理員對用戶進(jìn)行增刪改查,和踢用戶下線的操作。</p><p>  下面詳細(xì)介紹各個(gè)模塊的具體實(shí)現(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 這個(gè)類的監(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, "用戶名或密碼錯(cuò)誤", "錯(cuò)誤", JOptionPane.ERROR_MESSAGE);</p><p><b>  }</b></p><p><b>  });</b></p><p>  登錄邏輯是在public class IMClientU

52、serServer 里面,認(rèn)證成功者就會(huì)新建一個(gè)線程,專門負(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è)計(jì),減小的系統(tǒng)耦合。</p><p><b>  2)服務(wù)端代碼</b></p><p>  服務(wù)器端接收用戶驗(yàn)證信息的代碼被寫在了一個(gè)線程public class Serv

62、erThread extends Thread中,這樣服務(wù)器就可以不停的監(jiān)聽端口,接收來自不同客戶端的請求,建立socket連接,也不會(huì)堵塞在主線程當(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>  如果驗(yàn)證成功,查找是否有他的離線消息,有就發(fā)送給他。然后在服務(wù)器上專門開啟一個(gè)針對當(dāng)前用戶的線程,并且吧線程放入管理類中,便于日后的管理。</p><p>  if (checkLogin(u)) {</p><p>  // 返回一個(gè)成功登陸的信息報(bào)</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>  //為用戶單獨(dú)創(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>  //點(diǎn)擊的如果是發(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)用戶點(diǎn)擊發(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ā)送圖片信息的時(shí)候,先將圖片轉(zhuǎn)換成為byte[]數(shù)組,包裝在信息包種發(fā)送出去,接收到圖片信息時(shí)

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ā)送人 和時(shí)間</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>  //不在線就暫時(shí)存儲在服務(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來瀏覽本地文件,點(diǎn)擊瀏覽按鈕后,會(huì)彈出對話框,讓用戶選擇文件,然后將文件名,大小等信息封裝在數(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ā)送時(shí)間</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>  對方會(huì)顯示提示信息:</p><p>  圖 4-7 詢問接收文件圖</p><p>  如果對方同意接收則開啟線程。因?yàn)槲募赡鼙容^大,所以不能一次性發(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ā)送完成后,雙方的界面上都會(huì)顯示成功信息:</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)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論