用户数据报协议(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程序设计基础的更多相关文章

  1. 第19章 网络通信----TCP程序设计基础

    TCP网络程序设计是指利用Socket类编写通信程序.利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样. 1.InetAddr ...

  2. [Real World Haskell翻译]第27章 网络通信和系统日志 Sockets and Syslog

    第27章 网络通信和系统日志 Sockets and Syslog 基础网络 在本书的前面几章,我们讨论了运转在网络上的服务.其中的两个例子是客户端/服务器架构的数据库和Web服务.当需要制定一个新的 ...

  3. 《TCP/IP详解卷1:协议》第19章 TCP的交互数据流-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  4. Laxcus大数据管理系统2.0(8)- 第六章 网络通信

    第六章 网络通信 Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址.网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的 ...

  5. 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器

    第19章      RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...

  6. Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称

    Linux就这个范儿 第19章 团结就是力量  LSB是Linux标准化基地(Linux Standards Base)的简称 这个图片好可爱,它是LSB组织的图标.你肯定会问:“图标这么设计一定有说 ...

  7. 【C#4.0图解教程】笔记(第19章~第25章)

    第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板.   2.声明 ...

  8. 《Java大学教程》—第19章 改进用户界面

    用户与程序交互的媒介称为用户界面(user interface)或人机界面(human-computer interface). 19.2    Border接口8个实现Border接口的标准边框类: ...

  9. 【Android】19.0 第19章 前面章节的代码优化及本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-05 一.简介 这一章我们介绍"共享存储和内容提供程序"的基本用法. 二.先优化一下前面章节例子的代码 在前面 ...

随机推荐

  1. 02_嵌套矩形(DAG最长路问题)

    来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题2: 问题描述:有n个矩形,每个矩形可以用两个整数a,b描述,表示它们的长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中的条件 ...

  2. CSS实用的代码段

    摘抄的一些代码还有自己总结的常用的代码~ 1>浏览器样式统一 *{ margin:0px; padding:0px; } 浏览器样式统一 2>清除浮动的方法 3>跨浏览器设置透明度 ...

  3. vue setTimeout用法 jquery滚动到某一个div的底部

    //vue 中setTimeOut用法 var $this = this; setTimeout(function(){ $this.goEnd() }, 10); goEnd:function(){ ...

  4. k8s总结(脑图图片)

  5. Windows环境下32位汇编语言程序设计笔记-基础篇

    内存模式 .386 .model flat,stdcall ;子程序调用模式,win32中只能用stdcall,因为win32api调用使用的这个 option casemap:none ;定义了程序 ...

  6. ocr jdk

    公司有个需求,遍历所有图片,筛选出含有敏感字的图片.这里就需要ocr技术,找了几天,发现了几个不错的ocr jdk. http://cn.ocrsdk.com/ 俄罗斯公司,贵有贵的道理 http:/ ...

  7. iOS UIPrintInteractionController打印

    - (void)printData{ //为打印做准备,创建一个指向sharedPrintController的引用 UIPrintInteractionController *printer = [ ...

  8. 表格布局tabelLayout

    表格布局tabelLayout 一.简介 二.实例 <!-- 这个tableRow里面有两个组件,所以是两列 --> <!-- 这个tableRow里面有三个组件,所以是三列 --& ...

  9. info.plist 安全登录

    设置info.plist 安全登录 App Transport Security Settings  dictionary Allow Arbitrary Loads  Boolean  YES

  10. [Leetcode Week2]Sort Colors

    Sort Colors题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/sort-colors/description/ Description Give ...