无为

无为则可为,无为则至深!

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks
[程序设计]

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

posted on 2005-12-14 13:21 草儿 阅读(316) 评论(0)  编辑  收藏 所属分类: Java编程经验谈

只有注册用户登录后才能发表评论。


网站导航: