5.2 服务器端
(1)这部分代码包含的包只有三个:
基于Eclipse编程环境,实现一个局域网环境下的文件的广播以及接收系统: 一行一行读取文件然后广播,同一子网掩码下的的用户都可以接收并查看。
import java.awt.event.*; (2)界面设计
这部分的和发送端的原理一样,所以只给出代码如下:
public Receive() {
super("定时接收信息"); thread = new Thread(this);
开始接收 = new Button("开始接收"); 停止接收 = new Button("停止接收"); 停止接收.addActionListener(this); 开始接收.addActionListener(this);
显示正在接收内容 = new TextArea(10, 10); 显示正在接收内容.setForeground(Color.blue); 显示已接收的内容 = new TextArea(10, 10); Panel north = new Panel(); north.add(开始接收); north.add(停止接收);
add(north, BorderLayout.NORTH); Panel center = new Panel();
center.setLayout(new GridLayout(1, 2)); center.add(显示正在接收内容); center.add(显示已接收的内容); add(center, BorderLayout.CENTER); validate();
Button 开始接收, 停止接收;
TextArea 显示正在接收内容, 显示已接收的内容; Thread thread; boolean 停止 = false;
下面图5-2是接收端初始化界面的截图:
基于Eclipse编程环境,实现一个局域网环境下的文件的广播以及接收系统: 一行一行读取文件然后广播,同一子网掩码下的的用户都可以接收并查看。
图5-2接收端初始化界面
(3)事件处理部分主要代码
while (true) {
byte data[] = new byte[8192]; DatagramPacket packet = null;
packet = new DatagramPacket(data, data.length, group, port); try {
socket.receive(packet);
String message = new String(packet.getData(), 0, packet
.getLength());
显示正在接收内容.setText("正在接收的内容:\n" + message); 显示已接收的内容.append(message + "\n");
} catch (Exception e) { }
if (停止 == true) {
break;}
从这段代码中可以看出接收端的这部分代码和发送端的区别主要就在于把socket.send(packet);改为socket.receive(packet);
基于Eclipse编程环境,实现一个局域网环境下的文件的广播以及接收系统: 一行一行读取文件然后广播,同一子网掩码下的的用户都可以接收并查看。
5.3核心类
(1)类 MulticastSocket:
多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。
多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在 224.0.0.0 和 239.255.255.255 的范围内(包括两者)。地址 224.0.0.0 被保留,不应使用。
可以通过首先使用所需端口创建 MulticastSocket,然后调用 joinGroup(InetAddress groupAddr) 方法来加入多播组:
将消息发送到多播组时,该主机和端口的所有预定接收者都将接收到消息(在数据包的生存时间范围内,请参阅下文)。套接字不必成为多播组的成员即可向其发送消息。
当套接字预定多播组/端口时,它将接收由该组/端口的其他主机发送的数据报,像该组和端口的所有其他成员一样。套接字通过 leaveGroup(InetAddress addr) 方法放弃组中的成员资格。多个 MulticastSocket 可以同时预定多播组和端口,并且都会接收到组数据报。
同时,不允许 applet 使用多播套接字。 (2)类 Frame:
Frame 是带有标题和边框的顶层窗口。
窗体的大小包括为边框指定的所有区域。边框区域的尺寸可以使用 getInsets 方法获得,但是,由于这些尺寸与平台相关,因此在通过调用 pack 或 show 将窗体设置为可显示之前,将无法获得有效的 insets 值。由于窗体的总大小包括了边框区,因此边框实际上遮掩了窗体的部分区域,并将可用于在矩形中呈现和/或显示子部件的区域限制在一个矩形内,该矩形左上角的位置为 (insets.left, insets.top),宽度为 width - (insets.left + insets.right),长度为 height - (insets.top + insets.bottom)。
基于Eclipse编程环境,实现一个局域网环境下的文件的广播以及接收系统: 一行一行读取文件然后广播,同一子网掩码下的的用户都可以接收并查看。
(3)类 Thread
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止。
调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。
创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
5.4 所设计的广播系统工作效果截图
运行BroadCastWord.java后,点击“选择要广播的文件”按钮时出现的对话框如图5-3:
基于Eclipse编程环境,实现一个局域网环境下的文件的广播以及接收系统: 一行一行读取文件然后广播,同一子网掩码下的的用户都可以接收并查看。
图5-3选择文件路径
选择一txt文档,点击“开始广播”一段时间后的截图如图5-4: