和java通信_[源码和文档分享]基于JAVA的即时通信软件
一.設(shè)計(jì)任務(wù)書
1.1 設(shè)計(jì)任務(wù)
本文設(shè)計(jì)的是一個(gè)簡(jiǎn)單的即時(shí)通信軟件,利用 Java Socket 進(jìn)行點(diǎn)到點(diǎn)通信,其工作機(jī)制模仿即時(shí)通信軟件的基本功能,已實(shí)現(xiàn)的功能有:客戶端登錄
客戶端退出
群組成員之間傳輸文字或圖片信息
該軟件分為客戶端與服務(wù)器端,客戶端負(fù)責(zé)與服務(wù)器建立連接,且執(zhí)行收發(fā)消息的操作,服務(wù)器端負(fù)責(zé)等待客戶端連接并保存用戶的昵稱與客戶端 Socket 的輸出流的對(duì)應(yīng)關(guān)系。
1.2 技術(shù)指標(biāo)
本程序使用的是 TCP 協(xié)議實(shí)現(xiàn)的即時(shí)通信軟件,程序是基于 Java 語(yǔ)言開(kāi)發(fā)的,主要用到的技術(shù)有:Socket 編程
自定義協(xié)議
如果使用普通的方法來(lái)標(biāo)記一條消息的結(jié)束,如換行符,那么程序就不易擴(kuò)展,只能發(fā)送純文本消息,所以需要自己定義一種消息的格式,并且我們還需要提供發(fā)送消息與解析消息的方法。
服務(wù)器端創(chuàng)建一個(gè) ServerSocket,循環(huán)等待客戶端的連接,每當(dāng)有客戶端連接,就獲取到客戶端的 Socket 對(duì)象,并將該對(duì)象交付給一個(gè)服務(wù)器端線程處理,服務(wù)器端線程會(huì)不斷從 Socket 的輸入流中解析出消息類型、長(zhǎng)度及消息內(nèi)容,然后根據(jù)類型執(zhí)行不同的操作。
客戶端與服務(wù)器建立連接,同時(shí)開(kāi)啟一個(gè)客戶端線程接收服務(wù)器端發(fā)送的消息,客戶端登錄是向服務(wù)器發(fā)送一條登錄命令,客戶端向服務(wù)器發(fā)送一條消息首先需要包裝成定義的消息格式,然后再發(fā)送給服務(wù)器。
不管是發(fā)送消息還是發(fā)送命令其實(shí)本質(zhì)都是一條消息,向服務(wù)器發(fā)送的消息都必須按照定義的格式來(lái)。
1.3 論證結(jié)果
經(jīng)論證,這個(gè)任務(wù)是可行的。TCP 協(xié)議的實(shí)現(xiàn)細(xì)節(jié) Java Socket 已經(jīng)幫我們做好了,我們需要做的是定義一個(gè)協(xié)議工具類,實(shí)現(xiàn)發(fā)送消息與接收消息的方法,然后客戶端與服務(wù)器端都利用這兩個(gè)方法來(lái)進(jìn)行消息的發(fā)送與解析。
二.實(shí)現(xiàn)原理
2.1 基于 TCP 協(xié)議的即時(shí)通信
TCP 協(xié)議是一種端到端協(xié)議,當(dāng)一臺(tái)計(jì)算機(jī)要與遠(yuǎn)程的另一臺(tái)計(jì)算機(jī)連接時(shí),TCP 協(xié)議會(huì)讓他們建立一個(gè)用于發(fā)送和接收數(shù)據(jù)的虛擬鏈路。TCP 要負(fù)責(zé)收集數(shù)據(jù)信息包,并將其按照適當(dāng)?shù)拇涡蚍藕脗魉?#xff0c;接收端收到后再正確的還原,TCP協(xié)議使用了重發(fā)機(jī)制,當(dāng)一個(gè)通信實(shí)體發(fā)送一個(gè)消息到另一個(gè)通信實(shí)體后,需要接收到另一個(gè)通信實(shí)體的確認(rèn)消息,如果沒(méi)有收到確認(rèn)消息,則會(huì)重發(fā)消息。所以 TCP 協(xié)議保證了數(shù)據(jù)包在傳輸中不發(fā)生錯(cuò)誤。通信示意圖如圖 1 所示。
?
在通信實(shí)體 1 與通信實(shí)體 2 建立虛擬鏈路前,必須有一方主動(dòng)來(lái)接收其他通信實(shí)體的連接請(qǐng)求,作出“主動(dòng)”的通信實(shí)體稱為服務(wù)器,發(fā)出連接請(qǐng)求的通信實(shí)體稱為客戶機(jī)。
2.2 自定義協(xié)議的定義
2.2.1 通信原理
客戶端與服務(wù)器端相互通信,首先要建立 Socket 連接,連接建立好后雙方都會(huì)拿到一個(gè) Socket 對(duì)象,通過(guò) Socket 對(duì)象拿到輸入、輸出流可以實(shí)現(xiàn)寫、讀的功能。服務(wù)器端接收到客戶端的連接,將客戶端的 Socket 對(duì)象交付給一個(gè)線程,該線程負(fù)責(zé)維護(hù)該客戶端,在線程體中需要使用死循環(huán)不斷的獲取客戶端發(fā)給服務(wù)器的消息。
2.2.2 存在的問(wèn)題
那么問(wèn)題來(lái)了:怎么標(biāo)志客戶端發(fā)送的消息的結(jié)尾?如果不對(duì)結(jié)尾標(biāo)志,服務(wù)器端將不知道客戶端本次客戶端發(fā)送的消息到哪里。
參考文檔和完整的文檔和源碼下載地址:
總結(jié)
以上是生活随笔為你收集整理的和java通信_[源码和文档分享]基于JAVA的即时通信软件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dvd管理器java_Java DVD管
- 下一篇: java 与 乱码问题_透彻分析和解决一