广播数据报
广播数据报类似于广播电台,进行广播的电台需要在指定的波段频率上广播信息,接收者只有将收音机调到指定的波段,频率才能收到广播的内容
首先明确,广播数据包涉及地址和端口,已知Internet的地址是a.b.c.d的形式
改地址的一部分代表用户的主机,另一部分代表用户所在的网络
如果a<128
那么,b.c.d就表示主机
,该类地址称为A类地址
如果128≤a<192
那么a.b表示网络地址,c.d表示主机地址
,该类地址称为B类地址
如果a≥192
那么a.b.c表示网络网络地址,d表示主机地址
,该类地址称为C类地址
224.0.0.0~239.255.255.255
是保留地址,称为D类地址
一个具有A,B或C类地址的主机要想接收广播数据就必须要加入到同一个D类地址
实现广播套接字的类MulticastSocket类
.称为多点广播套接字类
inetAddress = InetAddress.getByName("239.255.7.0"); //选择一个D类地址
multicastSocket = new MulticastSocket(port); //存方法一个端口
multicastSocket.getTimeToLive(); //多点广播套接字发送数据使用本地网路
multicastSocket.joinGroup(inetAddress); //加入到D类地址中,当发送数据使D类地址的成员就会收到数据
一个类似收音机的例子
首先创建一个广播类
package Chapter_16.Part_5;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class BoardCast extends Thread {
String str = "现在插播一条天气预报!";
int port = 8888;
InetAddress inetAddress = null;
MulticastSocket multicastSocket = null;
BoardCast() {
try {
inetAddress = InetAddress.getByName("239.255.7.0"); //选择一个D类地址
multicastSocket = new MulticastSocket(port); //存方法一个端口
multicastSocket.getTimeToLive(); //多点广播套接字发送数据使用本地网路
multicastSocket.joinGroup(inetAddress); //加入到D类地址中,当发送数据使D类地址的成员就会收到数据
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
DatagramPacket datagramPacket = null; //要发送的数据包
byte b[] = str.getBytes(); //将字符串放到字节数据数组中
datagramPacket = new DatagramPacket(b, 0, b.length, inetAddress, port); //创建要发送的数据包
try {
multicastSocket.send(datagramPacket); //多点广播数据套接字发送数据包
sleep(2000); //发送一次休息两秒
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
BoardCast boardCast = new BoardCast();
boardCast.start();
}
}
然后再创建接收类
package Chapter_16.Part_5;
import com.sun.source.tree.NewArrayTree;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class Receiver extends JFrame implements Runnable, ActionListener {
JButton jButtonStart, jButtonStop;
JTextArea jTextArea1, jTextArea2;
MulticastSocket multicastSocket;
InetAddress inetAddress;
int port = 8888;
Thread thread;
boolean stop = false;
Receiver() {
setBounds(400, 400, 500, 500);
setTitle("接收广播信息窗口");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
thread = new Thread(this);
jButtonStart = new JButton("开始接收");
jButtonStart.addActionListener(this);
jButtonStop = new JButton("停止接收");
jButtonStop.addActionListener(this);
JPanel jPanel1 = new JPanel();
jPanel1.setLayout(new FlowLayout());
jPanel1.add(jButtonStart);
jPanel1.add(jButtonStop);
add(jPanel1, BorderLayout.NORTH);
jTextArea1 = new JTextArea(10, 10);
jTextArea2 = new JTextArea(10, 10);
JPanel jPanel2 = new JPanel();
jPanel2.setLayout(new GridLayout(1, 2)); //一行两列
jPanel2.add(new JScrollPane(jTextArea1));
jPanel2.add(new JScrollPane(jTextArea2));
add(jPanel2, BorderLayout.CENTER);
validate();
try {
inetAddress = InetAddress.getByName("239.255.7.0");
multicastSocket = new MulticastSocket(port); //使用同样的端口
multicastSocket.joinGroup(inetAddress); //加入D类地址
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
if (actionEvent.getSource() == jButtonStart) {
if (thread.isAlive() == false) {
thread = new Thread(this);
}
try {
thread.start();
stop = false;
} catch (Exception e) {
e.printStackTrace();
}
if (actionEvent.getSource() == jButtonStop) {
stop = true;
}
}
}
@Override
public void run() {
while (true) {
byte b[] = new byte[8192]; //最大接收数据的字节数组
DatagramPacket datagramPacket = new DatagramPacket(b, 0, b.length, inetAddress, port); //接收数据的包
try {
multicastSocket.receive(datagramPacket); //接收数据包
String string = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
jTextArea1.setText("正在接收数据:\n" + string);
jTextArea2.append(string + "\n");
} catch (IOException e) {
}
if (stop == true) {
break;
}
}
}
public static void main(String[] args) {
Receiver receiver = new Receiver();
}
}
运行效果图
文件的共享与保护
文件的共享
文件共享是指不同用户进程使用同一文件。常见的文件链接有硬链接和符号链接两种。
- 硬链接
文件的硬链接是指两个文件目录表目指向同一个索引节点的链接,该链接也称基于索引节点的链接。
文件硬链接不利于文件主要删除它所拥有的文件,因为文件主要删除它所拥有的共享文件,必须首先删除(关闭)所有的硬链接,否则就会造成共享该文件的用户目录表目指针悬空。
- 符号链接
符号链接是指建立的新的文件或目录与原来文件或目录的路径名映射。 当访问一个符号链接时,系统通过该映射找到原文件的路径,并对其进行访问。
符号链接的缺点:其他用户读取符号链接的共享文件和读取硬链接的共享文件相比,需要增加读盘操作的次数。
文件的保护
文件系统对文件的保护常采用存取控制方式进行,所谓存取控制,就是不同的用户对文件的访问有不同的权限,以防止文件被未经文件主同意的用户访问。
- 存取控制矩阵
理论上存取控制方法可采用存取控制矩阵实现,它是一个二维矩阵,一维列出计算机的全部用户,另一维列出系统中的全部文件,矩阵中每个元素A/是表示第i个用户对第j个文件的存取权限。通常存取权限有可读、可写、可执行以及它们的组合。
- 存取控制表
存取控制表是按用户对文件的访问权限的差别对用户进行分类,由于某一文件往往只与少数几个用户有关,所以这种分类方法可使存取控制表大为简化。UNIX系统使用的就是这种存取控制表方法。它把用户分成三类,包括文件主、同组用户和其他用户,每类用户的存取权限为可读、可写、可执行的组合。
- 用户权限表
用户权限表是以用户或用户组为单位将用户可存取的文件集中起来存入表中,表中每个表目表示该用户对相应文件的存取权限,这相当于存取控制矩阵一行的简化。
- 密码
在创建文件时,由用户提供一个密码在文件存入磁盘时用该密码对文件内容进行加密。进行读取操作时,要对文件进行解密,只有知道密码的用户才能读取文件。
CET4P204
- cornerstone
- dean
- hectare
- waterproof
- border
- silicon
- ample
- celsius
- cargo
- warmth
- creative
- complaint