基于UDP的歌词同步系统
1 系統(tǒng)功能說(shuō)明
1.1系統(tǒng)簡(jiǎn)介
 歌詞在線同步系統(tǒng),主要實(shí)現(xiàn)的是播放歌曲,然后能夠通過(guò)UDP通信,從服務(wù)端加載歌詞,并根據(jù)歌曲播放進(jìn)度同步顯示歌詞。
 1.2系統(tǒng)主要功能
 實(shí)現(xiàn)播放子系統(tǒng),其功能如下:
 1.播放終端能夠播放歌曲,并根據(jù)歌曲的信息從后臺(tái)下載歌詞
 2. 歌詞顯示應(yīng)當(dāng)與歌曲播放同步
 1.3系統(tǒng)開發(fā)環(huán)境
 編譯器:Spring tool suite
 運(yùn)行環(huán)境:JDK1.8導(dǎo)入整個(gè)項(xiàng)目,先運(yùn)行server.java,再運(yùn)行client.java即可啟動(dòng)項(xiàng)目
2 系統(tǒng)設(shè)計(jì)
2.1系統(tǒng)總體設(shè)計(jì)
 本系統(tǒng)采用的是CS結(jié)構(gòu),系統(tǒng)的功能結(jié)構(gòu)如下:
 (1)服務(wù)端:采用UDP協(xié)議,接收客戶端傳來(lái)的數(shù)據(jù),進(jìn)行處理,比如查詢歌詞信息,查詢到歌詞信息以后返回給客戶端,如果查詢不到結(jié)果,則返回相應(yīng)的提示信息。
 (2)客戶端:和用戶交互,接收用戶的操作輸入,并將數(shù)據(jù)發(fā)送給服務(wù)端處理,獲取返回結(jié)果展示在界面上,比如用戶點(diǎn)擊歌曲播放,客戶端獲取歌曲信息,發(fā)送給服務(wù)端,并且接收服務(wù)端返回的歌詞,同步顯示在界面上。
 2.2界面設(shè)計(jì)
 客戶端歌曲查詢界面:
 
 
 歌詞同步界面:
 
 加載圖片失敗:
 
 歌詞加載失敗:
 
 2.3 網(wǎng)絡(luò)通信
(1)網(wǎng)絡(luò)通信采用的是UDP通信模型,因?yàn)榭蛻舳诵枰蚍?wù)端請(qǐng)求歌曲的專輯圖片,歌 詞,以及歌曲的歌手,專輯等信息,所以在請(qǐng)求消息中需要設(shè)置標(biāo)志字段,用于區(qū)分服 務(wù)。
 (2)客戶端發(fā)送的數(shù)據(jù)格式、服務(wù)端接收的數(shù)據(jù)格式:
 songName#requestContent#currentTime
 各個(gè)字段的含義:
 songName:歌曲名字
 requestContent:請(qǐng)求內(nèi)容(包括歌曲基本信息songInfo、專輯圖片songImage、歌詞內(nèi)容 lrc)
 currentTime:歌曲播放的進(jìn)度時(shí)間
 (3)圖片是采用字節(jié)流的方式傳輸?shù)?#xff0c;從服務(wù)端讀取圖片,然后通過(guò)DatagramPacket 發(fā)送 給客戶端,客戶端把接收到的字節(jié)流轉(zhuǎn)換成圖片文件,存到臨時(shí)圖片文件中,同時(shí)顯示 到歌詞展示界面。
2.4 數(shù)據(jù)存儲(chǔ)
 服務(wù)端和客戶端發(fā)送的消息都是采用字節(jié)流的方式,它們的格式和存儲(chǔ)方式如下:
 (1)服務(wù)端和客戶端的資源存儲(chǔ)目錄如下:
 music/client-music 目錄下存放的是客戶端的歌曲,歌詞,界面背景圖片資源等
 music/server-music 目錄下存放的是服務(wù)端的歌詞,專輯圖片資源等
 
 (2)服務(wù)端存儲(chǔ)的是歌詞文件,歌曲專輯圖片文件;
 其中歌詞文件采用.lrc文件,其基本格式如樣例如下:
 
 而專輯圖片則采用.png的格式存儲(chǔ)。
(3)客戶端存儲(chǔ)的是歌曲文件信息,格式為.mp3,還有就是背景圖片,按鈕圖片,臨時(shí)圖片資源等
 其在項(xiàng)目中的存儲(chǔ)格式樣例如下:
 
2.5 多線程
 (1)在服務(wù)端使用了多線程處理,服務(wù)端分為兩個(gè)類,一個(gè)是Server類,一個(gè)是服務(wù)端線 程類UDPThread類。
 Server類:
 用于接受客戶端發(fā)送來(lái)的packet數(shù)據(jù)包,然后把數(shù)據(jù)包交給子線程處理,使用了兩 個(gè)DatagramSocket,一個(gè)接受數(shù)據(jù),一個(gè)發(fā)送數(shù)據(jù)。
 UDPThread 類:
 根據(jù)客戶端發(fā)送的數(shù)據(jù)包,判斷請(qǐng)求數(shù)據(jù)的類型,比如歌詞,圖片資源等,然后查 找對(duì)應(yīng)的資源,轉(zhuǎn)換成字節(jié)流發(fā)送給客戶端。
2.6同步與并發(fā)
 同步:客戶端實(shí)現(xiàn)了同步,當(dāng)讀取服務(wù)端歌詞的線程接收到服務(wù)端發(fā)來(lái)的歌詞文件的時(shí)候,需要先寫入本地歌詞文件中,而此時(shí),本地歌詞讀取線程可能也會(huì)同時(shí)讀取該歌詞文件,所以需要歌詞文件的寫入需要加上同步鎖。
 并發(fā):服務(wù)端采用了多線程,所以支持多個(gè)客戶端同時(shí)開啟,從服務(wù)端獲取歌詞,實(shí)現(xiàn)了并發(fā)。
3 系統(tǒng)錯(cuò)誤與調(diào)試
3.1 常見異常及處理方法
 (1)異常:客戶端掃描本地文件夾的歌曲文件,如果文件夾名不存在,產(chǎn)生空指針異常
 處理方法:判斷文件對(duì)象是否為空,處理代碼如下:
(2)異常:服務(wù)端查詢的歌詞文件或者圖片文件不存在,會(huì)產(chǎn)生空指針異常
 處理方法:
 服務(wù)端判斷讀的文件是否為空,如果為空,則發(fā)送無(wú)該歌詞文件或者圖片的消息給客戶 端(處理代碼如下):
3.2 系統(tǒng)實(shí)現(xiàn)過(guò)程中遇到的錯(cuò)誤及其解決方法
 (1)遇到的問題:在讀取mp3歌曲文件里歌曲信息的時(shí)候,采用jaudiotagger jar包讀取,但是讀取到的中文都是亂碼,采用了UTF-8,GBK轉(zhuǎn)碼都仍然是亂碼。
 解決辦法:自己寫代碼讀取MP3歌曲信息,在mp3文件的最后128個(gè)字節(jié)包含了歌曲的基本信息,讀取后轉(zhuǎn)換成GBK格式,成功解決了亂碼問題。
(2)遇到的問題:在歌詞同步的時(shí)候,最后一句歌詞不能同步
 解決辦法:歌詞獲取的判斷方法是根據(jù)歌曲時(shí)間在兩句歌詞之間來(lái)判斷的,因?yàn)樵谂袛嘧詈笠痪涓柙~的時(shí)候,后面沒有歌詞信息了,所以無(wú)法同步最后一句歌詞,解決辦法是加上一個(gè)判斷語(yǔ)句,判斷當(dāng)前是否是最后一行歌詞,如果是,則直接返回最后一句歌詞。
總結(jié)
以上是生活随笔為你收集整理的基于UDP的歌词同步系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: CVE-2013-4694 WinAmp
- 下一篇: 如何撰写竞聘演讲稿
