1. 程式人生 > >Java實現QQ附原始碼

Java實現QQ附原始碼

/**
客戶端主要實現類
1,QqClientLogin
public class QqClientLogin extends JFrame implements ActionListener{
 main(String[] args){}
 QqClientLogin(){}
 actionPerformed(ActionEvent arg0){}
}
Swing元件JFrame就是一個視窗,繼承JFrame(extends JFrame)就是畫出一個視窗;
implements ActionListener新增監聽事件;
mian方法啟動程式;
QqClientLogin方法初始化登陸介面;
actionPerformed方法實現滑鼠和鍵盤的監聽,將使用者操作和對應的業務邏輯程式碼
繫結到一起;
輸入使用者名稱和密碼後,使用者點選登陸按鈕時,去伺服器驗證;
登陸成功後,建立一個QQ客戶端QqFriendList,並且將它加入到好友佇列中進行管理,請求伺服器
返回所有線上的好友;
2,QqFriendList
public class QqFriendList extends JFrame implements ActionListener,MouseListener{
 //初始化視窗
 QqFriendList(String ownerId){}
 //滑鼠和鍵盤事件具體實現
 actionPerformed(ActionEvent arg0) {}
 mouseClicked(...){}
 
}
QqFriendList就是QQ主介面;
extends JFrame implements ActionListener,MouseListener這些也是為了建立視窗和新增鍵盤
和滑鼠監聽事件;
3,QqChat
public class QqChat extends JFrame implements ActionListener{
 //初始化視窗
 QqChat(String ownerId,String friend)
 //寫一個方法,讓它顯示訊息
 showMessage(Message m){}
 //監聽實現
 actionPerformed(ActionEvent arg0){}
}
QqChat就是聊天視窗介面;
extends JFrame implements ActionListener 監聽和建立視窗;
4,Message
public class Message implements java.io.Serializable{}
Message訊息實體;
implements java.io.Serializable訊息物件系列化是為了在網路上傳輸;
5,QqClientConServer
客戶端連線伺服器的後臺;
6,ClientConServerThread
客戶端和伺服器端保持通訊的執行緒
**********************************************************************************
Serializable 作用
序列化的attribute,是為了利用序列化的技術
準備用於序列化的物件必須設定 [System.Serializable] 標籤,該標籤指示一個類可以序列化。
便於在網路中傳輸和儲存
這個標籤是類可以被序列化的特性,表示這個類可以被序列化。
什麼叫序列化?
我們都知道物件是暫時儲存在記憶體中的,不能用U盤考走了,有時為了使用介質轉移物件,並且把物件的狀態保持下來,就需要把物件儲存下來,這個過程就叫做序列化,通俗點,就是把人的魂(物件)收伏成一個石子(可傳輸的介質)
什麼叫反序列化?
就是再把介質中的東西還原成物件,把石子還原成人的過程。
在進行這些操作的時候都需要這個可以被序列化,要能被序列化,就得給類頭加[Serializable]特性。
通常網路程式為了傳輸安全才這麼做。
簡介
序列化是指將物件例項的狀態儲存到儲存媒體的過程。在此過程中,先將物件的公共欄位和私有欄位以及類的名稱(包括類所在的程式集)轉換為位元組流,然後再把位元組流寫入資料流。在隨後對物件進行反序列化時,將創建出與原物件完全相同的副本。
在面向物件的環境中實現序列化機制時,必須在易用性和靈活性之間進行一些權衡。只要您對此過程有足夠的控制能力,就可以使該過程在很大程度上自動進行。例如,簡單的二進位制序列化不能滿足需要,或者,由於特定原因需要確定類中那些欄位需要序列化。以下各部分將探討 .NET 框架提供的可靠的序列化機制,並著重介紹使您可以根據需要自定義序列化過程的一些重要功能。
持久儲存
我們經常需要將物件的欄位值儲存到磁碟中,並在以後檢索此資料。儘管不使用序列化也能完成這項工作,但這種方法通常很繁瑣而且容易出錯,並且在需要跟蹤物件的層次結構時,會變得越來越複雜。可以想象一下編寫包含大量物件的大型業務應用程式的情形,程式設計師不得不為每一個物件編寫程式碼,以便將欄位和屬性儲存至磁碟以及從磁碟還原這些欄位和屬性。序列化提供了輕鬆實現這個目標的快捷方法。
公共語言執行時 (CLR) 管理物件在記憶體中的分佈,.NET 框架則通過使用反射提供自動的序列化機制。物件序列化後,類的名稱、程式集以及類例項的所有資料成員均被寫入儲存媒體中。物件通常用成員變數來儲存對其他例項的引用。類序列化後,序列化引擎將跟蹤所有已序列化的引用物件,以確保同一物件不被序列化多次。.NET 框架所提供的序列化體系結構可以自動正確處理物件圖表和迴圈引用。對物件圖表的唯一要求是,由正在進行序列化的物件所引用的所有物件都必須標記為 Serializable(請參閱基本序列化)。否則,當序列化程式試圖序列化未標記的物件時將會出現異常。
當反序列化已序列化的類時,將重新建立該類,並自動還原所有資料成員的值。
按值封送
物件僅在建立物件的應用程式域中有效。除非物件是從 MarshalByRefObject 派生得到或標記為 Serializable,否則,任何將物件作為引數傳遞或將其作為結果返回的嘗試都將失敗。如果物件標記為 Serializable,則該物件將被自動序列化,並從一個應用程式域傳輸至另一個應用程式域,然後進行反序列化,從而在第二個應用程式域中產生出該物件的一個精確副本。此過程通常稱為按值封送。
如果物件是從 MarshalByRefObject 派生得到,則從一個應用程式域傳遞至另一個應用程式域的是物件引用,而不是物件本身。也可以將從 MarshalByRefObject 派生得到的物件標記為 Serializable。遠端使用此物件時,負責進行序列化並已預先配置為 SurrogateSelector 的格式化程式將控制序列化過程,並用一個代理替換所有從 MarshalByRefObject 派生得到的物件。如果沒有預先配置為 SurrogateSelector,序列化體系結構將遵從下面的標準序列化規則(請參閱序列化過程的步驟)。
*/