<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
聊天程序的設計、實現和介紹
周寶峯
西安交通大學軟件學院 MSE 2002
2005.01
索 引
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 … |
Client1.Thread |
Client2.Thread |
Client3.Thread |
線程管理用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