[程序設計]
數據廣播與接收模塊Broadcast.java是本示例程序的核心部分。該類包括一個
構造方法,一個數據發送方法和一個數據接收方法。為了使這個類能夠被更加廣泛
的應用到其它應用程序中,作者又添加了一個端口配置方法。
在構造方法中,我們首先利用InetAddress 定義一個數據廣播組,同時構造一
個用于發送數據的DatagramSocket與一個用于接收數據的MulticastSocket。 在這
里我們使用230.0.0.1 來作為數據廣播組的標示符,雖然這個標示符與IP地址的格
式相同,但是它并不表示Internet上的一臺機器。此外,我們在端口配置方法中分
別指定1235端口和1236端口位數據發送和數據接收端口。如果把一個UDP 數據廣播
系統比喻成無線電廣播系統的話,數據廣播標示符可以被認為是波段,而數據接收
端口可以被認為是頻率。收音機用戶必須把收音機調整到相應的波段和頻率才能夠
接收到電臺信號,我們的UDP 數據接收程序也必須加入相對應的數據廣播組并且使
用正確的數據接收端口才能夠正確的接收到UDP 廣播數據。在構造方法中,我們利
用MulticastSocket 的構造函數指定數據接收端口(頻率),并利用其joinGroup 方
法指定數據廣播組(波段)。
public Broadcast()
{
GetBroadcastPorts();
try
{
// 構造數據廣播組標示符 (波段)
BroadcastGroup = InetAddress.getByName("230.0.0.1");
// 構造數據發送端口
Sender = new DatagramSocket(ServerPort);
// 構造數據接收端口 (頻率)
Receiver = new MulticastSocket(ClientPort);
// 指定數據接收端口的數據廣播組 (波段)
Receiver.joinGroup(BroadcastGroup);
} catch (Exception e) {}
}
在數據發送方法中,我們基于用戶所提供的數據以及數據廣播目甓絲?頻率)
構造一個DatagramPacket數據包,然后利用發送數據的DatagramSocket的send方法
將該數據包發送到局域網。與此相反,在數據接收方法中,我們首先構造一個空的
DatagramPacket數據包,然后利用接收數據的MulticastSocket的receive方法填充
該數據包中的內容。為了避免由于數據包大小不同所造成的數據丟失等麻煩,我們
特地將兩個數據包的大小設置成一樣的。
// 數據發送方法
public void SendData(String Msg)
{
byte[] b = new byte[1024];
DatagramPacket packet;
try
{
// 字節序列b 包括需要發送的數據
b = Msg.getBytes();
// 構造一個數據包,BroadcastGroup是數據廣播組標示符(波段),
// ClientPort是數據廣播目標端口(頻率)。
packet = new DatagramPacket(b, b.length, BroadcastGroup, ClientPort);
// 發送數據包
Sender.send(packet);
} catch (Exception e) {}
}
// 數據接收方法
public String ReceiveData()
{
byte[] b = new byte[1024];
// 構造一個空的數據包
DatagramPacket packet = new DatagramPacket(b, 1024);
String InMsg;
try
{
// 接收數據
Receiver.receive(packet);
} catch (IOException e) {}
// 叢數據包中獲得接收到的數據
b = packet.getData();
InMsg = new String(b);
return InMsg;
}
數據接收線程Receiver.java的任務是接收廣播數據并更新圖形用戶界面。該類
的構造函數包括兩個參數,參數listener指定用來接收數據的Broadcast對象,參數
display則指定用來顯示會議內容的TextArea對象。在其運行方法run 中,循環調用
Broadcast對象的數據接收方法ReceiveData 接收廣播數據,并且利用TextArea對象
的append方法將新接收到的內容顯示到圖形用戶界面上。
public class Receiver extends Thread
{
Broadcast Listener;
TextArea Display;
String InMsg;
// 構造方法
public Receiver(Broadcast listener, TextArea display )
{
// Listener 是一個數據發送與接收對象,用來接收數據。
Listener = listener;
/ Display是一個TextArea對象,用來顯示會議內容。
Display = display;
}
// 運行方法
public void run()
{
while(true)
{
// 接收廣播數據
InMsg = Listener.ReceiveData();
// 更新圖形用戶界面
Display.append(InMsg);
Display.append("\n");
}
}
}
圖形用戶界面chat.java是基于Java抽象窗口工具包AWT構建的。該界面包括一個
用來顯示會議內容TextArea,一個用來接收用戶輸入的TextField ,以及一個數據發
送命令按鈕。在Chat的構造方法中,我們首先創建圖形界面,構造一個數據發送與接
收對象和一個數據接收線程,然后啟動該線程開始接收會議信息。在這個方法中,我
們還利用InetAddress.getLocalHost()方法來獲得用戶的機器名,這個標示符被用來
作為用戶在網絡會議中的用戶名。
// 構造方法
public Chat()
{
// 創建圖形界面
add(CreateGui());
// ....
// 其它操作
// ....
// 構造一個數據發送與接收對象
Device = new Broadcast();
// 構造一個數據接收線程
Receiver Recv = new Receiver(Device, InMsg);
Recv.start();
}
[程序測試]
利用JDK 1.3編譯以上所有源代碼:
javac *.java
啟動網絡會議程序:
java Chat
本示例程序在一個包括Windows 98,Windows 2000,Red Hat Linux 6.1/7.0,
Mac OS,Sun Solaris等多種操作系統的局域網絡中通過測試。
[結論]
本文介紹了網絡通訊中通用的傳輸控制協議(TCP)和用戶數據包協議(UDP),并
且利用Java語言設計了一個簡單的基于UDP 數據廣播的局域網絡會議程序,展示了
在Java語言中進行UDP 數據發送和接收的一般步驟。本示例程序說明利用UDP 數據
廣播能夠輕易實現局域網絡會議的一般功能。由于Java語言卓越的跨平臺特性,一
個基于Java的局域網絡會議系統夠不加修改的運行在一系列不同平臺上。
凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
、轉載請注明來處和原文作者。非常感謝。