第19章 网络通信----UDP程序设计基础
用户数据报协议(UDP)是网络信息传输的另一种形式。
基于UDP通信的基本模式如下:
(1)将数据打包(称为数据包),然后将数据包发往目的地。
发送数据包:
使用DatagramSocket()创建一个数据包套接字;
使用DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)创建要发送的数据包;
使用DatagramSocket类的send()方法发送数据包。
(2)接收别人发来的数据包,然后查看数据包。
接收数据包:
使用DatagramSocket(int port)创建数据包套接字,绑定到指定的端口;
使用DatagramPacket(byte[] buf,int length)创建字节数组来接收数据包;
使用DatagramPacket类的receive()方法接收UDP包。
1、DatagramPacket类
2、DatagramSocket类
3、UDP网络程序
下面创建一个广播数据报程序。广播数据报是一种较新的技术,类似于电台广播,广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定的波段、频率才可以收听广播内容。
例如:主机不断地重复播出节目预报,可以保证加入到同一组的主机随时可接收到广播信息。接收者将正在接收的信息放在一个文本域中,并将接收的全部信息放在另一个文本域中。
(1)广播主机程序不断地向外播出信息,代码如下:
import java.net.*;
public class Weather extends Thread { // 创建类。该类为多线程执行程序
    String weather = "节目预报:八点有大型晚会,请收听";
    int port = 9898; // 定义端口
    InetAddress iaddress = null; // 创建InetAddress对象
    MulticastSocket socket = null; // 声明多点广播套接字
    Weather() { // 构造方法
        try {
            // 实例化InetAddress,指定地址
            iaddress = InetAddress.getByName("224.255.10.0");
            socket = new MulticastSocket(port); // 实例化多点广播套接字
            socket.setTimeToLive(1); // 指定发送范围是本地网络
            socket.joinGroup(iaddress); // 加入广播组
        } catch (Exception e) {
            e.printStackTrace(); // 输出异常信息
        }
    }
    public void run() { // run()方法
        while (true) {
            DatagramPacket packet = null; // 声明DatagramPacket对象
            byte data[] = weather.getBytes(); // 声明字节数组
            // 将数据打包
            packet = new DatagramPacket(data, data.length, iaddress, port);
            System.out.println(new String(data)); // 将广播信息输出
            try {
                socket.send(packet); // 发送数据
                sleep(3000); // 线程休眠
            } catch (Exception e) {
                e.printStackTrace(); // 输出异常信息
            }
        }
    }
    public static void main(String[] args) { // 主方法
        Weather w = new Weather(); // 创建本类对象
        w.start(); // 启动线程
    }
}

(2)接收广播程序:单击“开始接收”按钮,系统开始接收主机播出的信息;单击“停止接收”按钮,系统会停止广播主机播出的信息。
import java.awt.*;
import java.awt.event.*;
import java.net.*; import javax.swing.*; public class Receive extends JFrame implements Runnable, ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
int port; // 定义int型变量
InetAddress group = null; // 声明InetAddress对象
MulticastSocket socket = null; // 创建多点广播套接字对象
JButton ince = new JButton("开始接收"); // 创建按钮对象
JButton stop = new JButton("停止接收");
JTextArea inceAr = new JTextArea(10, 10); // 显示接收广播的文本域
JTextArea inced = new JTextArea(10, 10);
Thread thread; // 创建Thread对象
boolean b = false; // 创建boolean型变量 public Receive() { // 构造方法
super("广播数据报"); // 调用父类方法
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
thread = new Thread(this);
ince.addActionListener(this); // 绑定按钮ince的单击事件
stop.addActionListener(this); // 绑定按钮stop的单击事件
inceAr.setForeground(Color.blue); // 指定文本域中文字颜色
JPanel north = new JPanel(); // 创建Jpane对象
north.add(ince); // 将按钮添加到面板north上
north.add(stop);
add(north, BorderLayout.NORTH); // 将north放置在窗体的上部
JPanel center = new JPanel(); // 创建面板对象center
center.setLayout(new GridLayout(1, 2)); // 设置面板布局
center.add(inceAr); // 将文本域添加到面板上 final JScrollPane scrollPane = new JScrollPane();
center.add(scrollPane);
scrollPane.setViewportView(inced);
add(center, BorderLayout.CENTER); // 设置面板布局
validate(); // 刷新
port = 9898; // 设置端口号
try {
group = InetAddress.getByName("224.255.10.0"); // 指定接收地址
socket = new MulticastSocket(port); // 绑定多点广播套接字
socket.joinGroup(group); // 加入广播组
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
setBounds(100, 50, 360, 380); // 设置布局
setVisible(true); // 将窗体设置为显示状态
} public void run() { // run()方法
while (true) {
byte data[] = new byte[1024]; // 创建byte数组
DatagramPacket packet = null; // 创建DatagramPacket对象
// 待接收的数据包
packet = new DatagramPacket(data, data.length, group, port);
try {
socket.receive(packet); // 接收数据包
String message = new String(packet.getData(), 0, packet
.getLength()); // 获取数据包中内容
// 将接收内容显示在文本域中
inceAr.setText("正在接收的内容:\n" + message);
inced.append(message + "\n"); // 每条信息为一行
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
if (b == true) { // 当变量等于true时,退出循环
break;
}
}
} public void actionPerformed(ActionEvent e) { // 单击事件
if (e.getSource() == ince) { // 单击按钮ince触发的事件
ince.setBackground(Color.red); // 设置按钮颜色
stop.setBackground(Color.yellow);
if (!(thread.isAlive())) { // 如线程不处于“新建状态”
thread = new Thread(this); // 实例化Thread对象
}
thread.start(); // 启动线程
b = false; // 设置变量值
}
if (e.getSource() == stop) { // 单击按钮stop触发的事件
ince.setBackground(Color.yellow); // 设置按钮颜色
stop.setBackground(Color.red);
b = true; // 设置变量值s
}
} public static void main(String[] args) { // 主方法
Receive rec = new Receive(); // 创建本类对象
rec.setSize(460, 200); // 设置窗体大小
}
}

说明:要广播或接收广播的主机地址必须加入到一个组内,地址范围为224.0.0.0~224.255.255.255,这类地址并不代表某个特定主机的位置。加入到同一个组的主机可以在某个端口上广播信息,也可以在某个端口上接收信息。
第19章 网络通信----UDP程序设计基础的更多相关文章
- 第19章  网络通信----TCP程序设计基础
		
TCP网络程序设计是指利用Socket类编写通信程序.利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样. 1.InetAddr ...
 - [Real World Haskell翻译]第27章 网络通信和系统日志 Sockets and Syslog
		
第27章 网络通信和系统日志 Sockets and Syslog 基础网络 在本书的前面几章,我们讨论了运转在网络上的服务.其中的两个例子是客户端/服务器架构的数据库和Web服务.当需要制定一个新的 ...
 - 《TCP/IP详解卷1:协议》第19章 TCP的交互数据流-读书笔记
		
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
 - Laxcus大数据管理系统2.0(8)- 第六章 网络通信
		
第六章 网络通信 Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址.网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的 ...
 - 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器
		
第19章 RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...
 - Linux就这个范儿 第19章 团结就是力量  LSB是Linux标准化基地(Linux Standards Base)的简称
		
Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称 这个图片好可爱,它是LSB组织的图标.你肯定会问:“图标这么设计一定有说 ...
 - 【C#4.0图解教程】笔记(第19章~第25章)
		
第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板. 2.声明 ...
 - 《Java大学教程》—第19章 改进用户界面
		
用户与程序交互的媒介称为用户界面(user interface)或人机界面(human-computer interface). 19.2 Border接口8个实现Border接口的标准边框类: ...
 - 【Android】19.0 第19章 前面章节的代码优化及本章示例主界面
		
分类:C#.Android.VS2015: 创建日期:2016-03-05 一.简介 这一章我们介绍"共享存储和内容提供程序"的基本用法. 二.先优化一下前面章节例子的代码 在前面 ...
 
随机推荐
- The Linux Storage Stack Diagram 内核 4.0 版的 I/O 栈
 - laravel 邮箱改密功能
			
参考网址: http://laravelacademy.org/post/1290.html
 - 转载 Deep learning:一(基础知识_1)
			
前言: 最近打算稍微系统的学习下deep learing的一些理论知识,打算采用Andrew Ng的网页教程UFLDL Tutorial,据说这个教程写得浅显易懂,也不太长.不过在这这之前还是复习下m ...
 - CodeForces 698B  Fix a Tree (并查集应用)
			
当时也是想到了并查集,但是有几个地方没有想清楚,所以就不知道怎么写了,比如说如何确定最优的问题.赛后看了一下别人的思路,才知道自己确实经验不足,思维也没跟上. 其实没有那么复杂,这个题目我们的操作只有 ...
 - leetcode83,删除有序链表中的重复元素
			
Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...
 - python datetime时间差
			
import datetime import time d1 = datetime.datetime(2005, 2, 16) d2 = datetime.datetime(2004, 12, 31) ...
 - Java线程:新特征-有返回值的线程
			
http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...
 - IntelliJ IDEA 7.0 正式版注册机代码
			
好神奇,第一次看见注册机的源代码,自己运行一下.可以是java IDE环境,也可以是配置好jdk的dos环境. 然后输入自己的用户名就可以获得相对应的注册码,输入到软件中即可. 仅供参考,请购买正版. ...
 - Global事件执行顺序
			
Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务.下面让我们详细看 ...
 - ecshop foreach循环判断循环次数
			
首先要在foreach里面加上一个name属相,如:name=name如:<!-- {foreach from=$package_goods.goods_list item=goods_list ...