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