[程序设计]
数据广播与接收模块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(草儿)原创,凡是索引、收藏
、转载请注明来处和原文作者。非常感谢。