<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
聊天程式的設計、實現和介紹
周寶峰
西安交通大學軟體學院 MSE 2002
2005.01
索 引
1. 程式設計... 3
2. 程式使用... 4
2.1 伺服器的使用... 5
2.2 用戶端的使用... 5
3. 參考文獻... 6
1. 程式設計
程式設計環境:
採用Borland 公司 Delphi 7 企業版在Windows 2000 專業版上開發。
其他設計細節:
TCP 伺服器:
採用TIdTCPServer <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 實現.用於文本的互動.
對於每一個用戶端的TCP串連,啟動一個線程處理。結構圖如下:
| 監聽線程 Accept Client 1 Accept Client 1 Accept Client 1 … |
線程管理用TIdThreadMgrDefault管理。
UDP 伺服器:
採用 INDY 中的 TIdUDPServer 實現。當收到UDP包時,觸發UDPRead 事件,在此進行聲音資料的播放。
UDP用戶端:
採用INDY 中的TIDUDPClient實現。當收集的聲音資料超過緩衝區
大小(2048個位元組)後,調用其SendBuffer方法將資料發出。
聲音的提取:
採用TACMIN 控制項收集聲音,ACMIN控制項主要也是調用Windows API waveInOpen 函數。函式宣告:
function waveInOpen; external mmsyst name 'waveInOpen';
(MMSystem.pas)
聲音編碼:
預設採用GSM6.10 編碼,詳細編碼支援情況:
GSM 6.10 8kHz, Mono – 預設
11.025kHz, Mono
22.050kHz, Mono
44.100 kHz, Mono
Micorsoft G.723.1 8 kHz Mono, 6400 bit/s
8 kHz Mono, 5333 bit/s
PCM 8/11/12/16/22/24/32/44/48 kHz, 8/16/Bit, Mono
MPET Layer –3
56/40/48/32/20/24/12/16/8 kBit/s, 24,000/22,000/16,000/8,000 Hz, Stereo
…..
聲音輸出:
當UDP伺服器收到資料,使用ACMOut 播放。
AData.Read(AudioArray,AData.Size);
if not audioOut.Active then begin
with m_PlayAudioFormat.Format do begin
wFormatTag := 1;
nChannels := 1;
nSamplesPerSec := 22050;
nAvgBytesPerSec:= 22050;
nBlockAlign:=1;
wbitspersample := 8;
cbSize := SizeOf(TACMWaveFormat);
End;
//adioOut.Open(audioConvertor.FormatIn);
audioOut.Open(m_PlayAudioFormat);
end;
audioOut.Play(AudioArray, AData.Size);
2. 程式使用
注意:伺服器程式和用戶端程式不可運行在同一機器上(避免聲音播放和收集衝突),一台機器只能同時運行一個伺服器程式或者一個用戶端程式。
伺服器端的記錄檔:CharSvr.log
用戶端的記錄檔:ClientError.log
2.1 伺服器的使用
2.2 用戶端的使用
選擇線上的使用者後方可發言。 3. 參考文獻
[1] Indy in Depth Atozed Software