1. 程式人生 > >仿QQ聊天工具(JAVA實現)專案總結

仿QQ聊天工具(JAVA實現)專案總結

一、遇到的異常及解決辦法

1.        org.hibernate.HibernateException:Could not parse configuration: /hibernate.cfg.xml

..省略

Caused by: org.dom4j.DocumentException: www.hibernate.orgNested exception: www.hibernate.org

解決辦法:這是因為沒有聯網

2.        hibernate配置聯合主鍵,被聯合的各個欄位必須加“insert=”false””屬性,否則會欄位重複插入,導致異常

<class name="AddFriend"table="msn_addfriend" catalog="newmsn">

                       <composite-id>

                       <key-propertyname="requestSenderId"></key-property>

                       <key-propertyname="requestReceiverId"></key-property>

              </composite-id>

              <propertyname="requestSenderId" type="java.lang.Integer"insert="false"

>

                       <columnname="requestSenderID"></column>

              </property>

              <propertyname="requestReceiverId" type="java.lang.Integer" insert="false">

                       <columnname="requestReceiverID"></column>

              </property>

</class>

二、專案中遇到的難題及解決辦法

1.        在好友列表中,怎麼使用JList做出類似QQ那樣的列表項(既有圖片也有文字)


解決辦法:重寫ListCellRenderer類,自己實現JList中的物件的表現效果,否則只能顯示字串,具體如下:

主要是重寫getListCellRendererComponent這個方法,你可以在這個類中顯示JLabel等其他元件,value就是你加入到JList中的物件。最後用呼叫JListsetCellRenderer方法設定它的渲染器。

2.        怎麼實現在一臺電腦上可以登入多個客戶端,並且他們之間正常通訊

解決辦法:大家肯定知道通過埠號,但是僅僅是在每次建立客戶端的時候,port++是不行的。我的解決辦法是通過讀寫檔案,每次建立新的客戶端的時候就從檔案中讀取一個埠號,然後port++,再把port++寫入檔案,以便下一次讀到的與這次不同。

3.        怎麼實現一個客戶端同時開啟多個聊天視窗,而且接收訊息互不干擾

解決辦法:每個聊天視窗再設定一個ID,唯一標示該視窗,然後用一個Map儲存這些視窗,key是視窗IDelement是視窗,這樣每次接收到訊息時,遍歷這個Map,找到對應的視窗,將訊息傳給他。

4.        每個客戶端的ip不一樣,而且不同時間也可能不一樣,比如我在學校,ip是隨機分配的,不可能每個客戶端儲存一份所有其它客戶端的ip。怎麼實現他們之間的通訊呢?

解決辦法:通過伺服器轉發訊息。每次一個客戶端登入時,就把自己的ip和埠號發給有固定ip和埠號的伺服器,伺服器用Map存起來,key是客戶端的使用者(登入客戶端的User)的IDelement是客戶端的ip和埠號。這樣當有一個使用者給另一個使用者發訊息時,就發給伺服器(要表示發給哪一個User),伺服器在Map中查詢那個客戶端的登入資訊,然後把訊息發給那個客戶端。