摘 要: 以JAVA技術(shù)為核心,利用計(jì)算機(jī)局域網(wǎng)通信機(jī)制原理(例如TCP/IP協(xié)議、客戶端/服務(wù)器端模式(C/S模式)、網(wǎng)絡(luò)編程設(shè)計(jì)方法等)完成了一款適合局域網(wǎng)的仿QQ聊天系統(tǒng)。該系統(tǒng)主要由一個(gè)聊天服務(wù)器端程序和一個(gè)聊天客戶端程序兩塊組成。前者通過(guò)Socket套接字建立服務(wù)器,服務(wù)器能讀取、轉(zhuǎn)發(fā)客戶端發(fā)來(lái)的信息,并能刷新用戶列表;后者通過(guò)與服務(wù)器建立連接來(lái)進(jìn)行客戶端與客戶端的信息交流。經(jīng)測(cè)試,系統(tǒng)工作性能穩(wěn)定,基本能達(dá)到聊天功能,并實(shí)現(xiàn)了部分附加功能。
關(guān)鍵詞: 即時(shí)通信; 通信協(xié)議; Socket; 多線程
隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)絡(luò)聊天工具已經(jīng)成為人們?nèi)粘=涣鞯囊环N重要工具。它通信速度快,成本低,更重要的是方便人們信息的交流和資料的傳遞,所以開(kāi)發(fā)一個(gè)易于操作并擁有友好界面的聊天工具可以較好地解決現(xiàn)實(shí)生活中通信費(fèi)用高昂以及電話的單線程通信等問(wèn)題[1]。QQ聊天系統(tǒng)是一款基于互聯(lián)網(wǎng)的即時(shí)通信系統(tǒng),它允許人們利用英特網(wǎng)技術(shù)實(shí)時(shí)地傳送信息,并且能讓用戶選擇性地接受或拒絕其他用戶的信息。由于QQ有著出色的通信性能并且其用戶普及度較高,因此本課題在模仿QQ的前提下,設(shè)計(jì)了一款具有聊天功能及其他附加功能的軟件。
1 系統(tǒng)分析
1.1 需求分析
聊天系統(tǒng)最重要的是服務(wù)器端和客戶端兩個(gè)方面。服務(wù)器端有兩個(gè)主要任務(wù):
(1)服務(wù)器端應(yīng)當(dāng)建立一個(gè)ServerSocket,并且不斷進(jìn)行監(jiān)聽(tīng),判斷是否有客戶端連接請(qǐng)求或斷開(kāi)連接。
(2)服務(wù)器端應(yīng)當(dāng)是一個(gè)信息發(fā)送中心,所有客戶端的信息都傳到服務(wù)器端,由服務(wù)器端根據(jù)要求分發(fā)信息給客戶端。
客戶端要完成的工作:
(1)與服務(wù)器端建立通信通道,向服務(wù)器端發(fā)送信息。
(2)接收來(lái)自服務(wù)器的應(yīng)答信息。
解決了上述的4個(gè)問(wèn)題,也就完成了聊天系統(tǒng)的核心任務(wù)。
1.2 功能分析
1.2.1 服務(wù)器端功能
服務(wù)器管理員具有開(kāi)啟服務(wù)、關(guān)閉服務(wù)、配置服務(wù)器等功能。具體功能圖如圖1所示。
1.3 開(kāi)發(fā)環(huán)境工具
基于JAVA語(yǔ)言的聊天系統(tǒng)主要運(yùn)用JAVA語(yǔ)言與Socket類(lèi)[2-3]結(jié)合進(jìn)行開(kāi)發(fā)。在開(kāi)發(fā)過(guò)程中的主要環(huán)境包括:
(1)服務(wù)器端:Windows平臺(tái)上首先有JAVA的jdk環(huán)境,一般采用jdk1.6,此外需要配置相應(yīng)的path、classpath環(huán)境變量,并添加運(yùn)行所需要的各種jar包,本系統(tǒng)開(kāi)發(fā)的工具為Eclipse10.0。
(2)客戶端:滿足JAVA的jdk環(huán)境,主要采用jdk1.6。
(3)本次設(shè)計(jì)主要用到的類(lèi):java.net包中的Socket類(lèi)、java.swing包中的類(lèi)、java.awt包中的類(lèi)以及java.util包中的集合類(lèi)。
2 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
2.1 系統(tǒng)設(shè)計(jì)要點(diǎn)
聊天系統(tǒng)的設(shè)計(jì)主要是提供滿足用戶雙方直接進(jìn)行實(shí)時(shí)聊天的服務(wù),在設(shè)計(jì)聊天系統(tǒng)的過(guò)程中,必須要考慮好以下幾個(gè)設(shè)計(jì)要點(diǎn):
(1)實(shí)現(xiàn)思想
在Internet上的聊天程序一般都是以服務(wù)器提供服務(wù)端連接響應(yīng),用戶通過(guò)客戶端程序登錄到特定服務(wù)器,即可與登錄在同一服務(wù)器上的用戶進(jìn)行交流,這是一個(gè)面向連接的通信過(guò)程。因此,要在TCP/IP環(huán)境下[4-5],實(shí)現(xiàn)服務(wù)器端和客戶端兩部分程序。
(2)服務(wù)器端工作流程
服務(wù)器端通過(guò)socket()系統(tǒng)創(chuàng)建一個(gè)ServerSocket來(lái)對(duì)客戶端進(jìn)行接收,并與指定的本地端口綁定bind(),就可以在端口進(jìn)行監(jiān)聽(tīng)listen()。Map<String,socket>用以存儲(chǔ)用戶姓名和對(duì)應(yīng)的Socket。通過(guò)ChatRoomServerThread線程類(lèi)來(lái)處理不同請(qǐng)求。如果有客戶端連接請(qǐng)求,則給出一個(gè)相應(yīng)的Socket,將客戶端地址賦給這個(gè)Socket。登錄成功的用戶就可以在服務(wù)器上聊天。
(3)客戶端工作流程
客戶端程序相對(duì)簡(jiǎn)單,只需要建立一個(gè)Socket與服務(wù)器端連接,成功后通過(guò)這個(gè)Socket來(lái)發(fā)送和接收數(shù)據(jù)即可。
2.2 服務(wù)器端程序模塊
服務(wù)器與客戶端間通過(guò)套接口Socket(TCP)連接。JAVA API為處理套接口的通信提供了一個(gè)相關(guān)類(lèi)java.net.Socket,因此在JAVA中使用套接口相對(duì)簡(jiǎn)單,編寫(xiě)網(wǎng)絡(luò)應(yīng)用程序也相對(duì)比較容易。服務(wù)器端采用多線程來(lái)滿足多用戶的請(qǐng)求,并在服務(wù)器端通過(guò)創(chuàng)建一個(gè)ServerSocket對(duì)象來(lái)監(jiān)聽(tīng)來(lái)自客戶端的連接請(qǐng)求,默認(rèn)端口自定5044,繼而無(wú)限循環(huán)調(diào)用accept()方法接受客戶程序的連接。
服務(wù)器端程序框圖如圖3所示,服務(wù)器開(kāi)啟主要步驟為:
(1)制造ServerSocket,對(duì)客戶端進(jìn)行接收
private void createServerSocket(){}
(2)啟動(dòng)服務(wù)器,循環(huán)接收消息
public void startService() {
while (true) {
s = ss.accept();
new ChatRoomServerThread(s).start();
}
}
(3)線程類(lèi)處理各種請(qǐng)求,在run()方法中依據(jù)不同類(lèi)型請(qǐng)求進(jìn)行各種操作
class ChatRoomServerThread extends Thread {
//主要方法
public ChatRoomServerThread(Socket s) {}
public void run(){
sendOnlineUserList(){}
sendMessageToClient(String mesg, String clientUserName) {}
sendMessageToAllClient(String mesg){}
//向所有好友發(fā)送消息
}
}
2.3 客戶器端程序模塊
客戶端通過(guò)Socket與服務(wù)器建立連接。服務(wù)器與客戶端通過(guò)構(gòu)造器ObjectInputStream與ObjectOutputStream建立輸入/輸出流,然后雙方通過(guò)該輸入/輸出流相互傳遞信息。一旦收到客戶端的連接請(qǐng)求,服務(wù)器accept()方法立即返回一個(gè)新建的Socket對(duì)象??蛻舳死^而向服務(wù)器發(fā)送消息,比如文件傳輸?shù)?,服?wù)器收到來(lái)自客戶的請(qǐng)求后,針對(duì)不同的消息處理不同的請(qǐng)求??蛻舳送ㄟ^(guò)多線程類(lèi)ReadMessageThread處理用戶不同類(lèi)型的請(qǐng)求。其程序框圖如圖4所示。
系統(tǒng)除了以上功能之外,還有一些附加功能模塊,可以通過(guò)菜單欄進(jìn)行選擇,包括設(shè)置聊天窗口界面、單機(jī)游戲(掃雷)、便利記事本、文件上傳等。
本次設(shè)計(jì)的仿QQ聊天軟件系統(tǒng)運(yùn)行穩(wěn)定,用戶通過(guò)客戶端軟件可實(shí)現(xiàn)聊天的基本功能,并添加了一些附加功能。但還存在著一些不足之處,比如用戶管理不夠全面,只能顯示在線用戶;另外系統(tǒng)未與數(shù)據(jù)庫(kù)進(jìn)行連接。因此系統(tǒng)在投入使用之前還需要不斷地完善。
參考文獻(xiàn)
[1] 龐怡,許洪光,姜媛.即時(shí)通訊工具現(xiàn)狀及發(fā)展趨勢(shì)分析[J]. 科技情報(bào)開(kāi)發(fā)與經(jīng)濟(jì),2006,16(16):169-170.
[2] 童銘.基于Socket的多用戶通信框架及實(shí)現(xiàn)[J].四川大學(xué)學(xué)報(bào)(自然科學(xué)版),2006,43(3):702-705.
[3] 李峰. 利用流式Socket編程實(shí)現(xiàn)Window與Linux的通 信[J].微計(jì)算機(jī)信息,2006,22(3):112-113.
[4] 楊延雙, 張建標(biāo), 王全明. TCP/IP協(xié)議分析及應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2007.
[5] 李素俠,段友祥.嵌入式TCP_IP協(xié)議的分析與研究[J].微計(jì)算機(jī)信息,2005(20):20-20.