《java入门第一季》之UDP协议下的网络编程详解
首先看一下UDP协议的图解:
可以看到,分为发送端和接收端程序。
直接上代码:
发送端程序:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* UDP协议发送数据: (底层是IO)
* A:创建发送端Socket对象
* B:创建数据,并把数据打包
* C:调用Socket对象的发送方法发送数据包
* D:释放资源
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建发送端Socket对象
// 发送端DatagramSocket类的无参构造方法:public DatagramSocket():构造数据套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket ds = new DatagramSocket(); // 创建数据,并把数据打包
/*
* public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
* 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
* buf - 包数据。length - 包长度。address - 目的地址。port - 目的端口号。(与下面的对应)
*/
// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
// 创建数据
byte[] bys = "hello,UDP,我来了".getBytes();
// 长度
int length = bys.length;
// IP地址对象
InetAddress address = InetAddress.getByName("192.168.1.100");//这是我的电脑的另一台电脑的ip地址
// 端口
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, address, port); // 调用Socket对象的发送方法发送数据包
// public void send(DatagramPacket p)
/*
* public void send(DatagramPacket p)从此套接字发送数据报包。
* DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。找DatagramPacket构造方法,能传递数据、其长度、远程主机的 IP 地址和远程主机的端口号
*/
ds.send(dp); // 释放资源 DatagramSocket类下:public void close()关闭此数据报套接字。
ds.close();
}
}
接着写出接收端:在我的另一台电脑写出来的。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; /*
* UDP协议接收数据:
* A:创建接收端Socket对象
* B:创建一个数据包(接收容器),我称它为集装箱
* C:调用Socket对象的接收方法接收数据
* D:解析数据包,并显示在控制台
* E:释放资源
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端Socket对象
// DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(10086); // 创建一个数据包(接收容器)
// DatagramPacket(byte[] buf, int length)构造 DatagramPacket,用来接收长度为 length 的数据包。
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length); // 调用Socket对象的接收方法接收数据
// DatagramSocket类:public void receive(DatagramPacket p)从此套接字接收数据报包。p - 要放置传入数据的 DatagramPacket。 ds.receive(dp); // 阻塞式 此时接收数据后存储到dp(收端的集装箱)里面了 // 解析数据包,并显示在控制台
// 获取对方的ip对象。某台机器的 IP 地址,此数据报将要(发往)该机器或者是从该机器(接收)到的。这里是接收方IP名称对象
// public InetAddress getAddress()
InetAddress address = dp.getAddress();//getAddress().你发送端是发往哪个IP地址,这里就是那个IP地址的对象
String ip = address.getHostAddress();//获取发送端的IP地址
// public byte[] getData():获取数据缓冲区
// public int getLength():获取数据的实际长度
byte[] bys2 = dp.getData();//实际从发送方接收了的数据存储的字节长度,单独开一个数组存储。实际上是存在了bys里面;但是实际长度不知道多长,这里是吧实际长度从bys里拿出来组成了一个数组
int len = dp.getLength();//实际从发送方接收了数据字节有多大public int getLength()返回将要发送或接收到的数据的长度。 这里是实际接收到的长度
String s = new String(bys2, 0, len);//通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于该byte数组的长度。
System.out.println(ip + "传递的数据是:" + s);
//String构造方法:——public String(byte[] bytes,int offset,int length)。把bytes数组,从offset开始length的字节转换为字符串。
// 释放资源
ds.close();
}
}
udp实现了网络传输数据。把数据从一台电脑发送到了另一台电脑
《java入门第一季》之UDP协议下的网络编程详解的更多相关文章
- 《java入门第一季》二维数组三个案例详解
案例一:遍历二维数组 /* 需求:二维数组遍历 外循环控制的是二维数组的长度,其实就是一维数组的个数行数. 内循环控制的是一维数组的长度,每一行,一维数组元素分别的个数. */ class Array ...
- 《java入门第一季》之UDP协议下的网络编程小案例
需求,一台电脑发送数据,其他电脑都可以收到该数据.使用广播地址. 发送端: import java.io.BufferedReader; import java.io.IOException; imp ...
- JAVA入门第一季(mooc-笔记)
笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...
- Java入门第一季——从此投身Java??
找工作告一段落. 最后的工作呢,和java紧密相关,也是阴差阳错,不过都是软件开发,都好了,不过以后侧重点肯定是在java这边,php有机会还是一直学下去的,那么美的说~ Java开发第一季 一.简 ...
- 《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)
根据排序算法,可以解决一些小案例.举例如下: /* * 把字符串中的字符进行排序. * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: ...
- Java入门第一季
慕课网:http://www.imooc.com/learn/85 Java入门知识第一季 1.Java开发环境和IDE的使用: 2.变量和常量 3.常用的运算符 4.流程控制语句 5.数组:使用Ar ...
- 《java入门第一季》之面向对象(谈谈接口)
软件中有接口,这里的接口与硬件中的接口还是有很大区别的. 这里介绍接口不考虑JDK8的新特性(JDK8开始接口里面可以有非抽象方法了,介绍JDK8新特性可能要到整个第一季写完吧!) 还是直接进入接口的 ...
- 《java入门第一季》之网络编程初探
由于在写有关javaweb的博客,在写到web服务器的时候需要回顾网络编程的知识,提前把网络编程放在前面写. 直接上代码解释: import java.net.InetAddress; import ...
- Java网络编程详解
内容: 1.网络通信协议 2.UDP与TCP 3.UDP通信 4.TCP通信 5.网络编程总结 1.网络通信协议 (1)基本概念 网络:由多台计算机以及外部设备连接起来的一个系统,我们称之为网络 通信 ...
随机推荐
- @RequestBody和@RequestParam区别
@RequestParam 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容.(Http协议中,默认传递的参数就是applicati ...
- Gradle--初识
1.Eclipse从svn导入Gradle项目 1.检出项目的时候不要选新项目,选"做为工作空间中的项目检出",然后点Finish. 2.将项目转为Gradle项目,右键导入的项目 ...
- node之fs模块
前言 fs是filesystem的缩写,该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装.但是,这个模块几乎对所有操作提供异步和同步两种操作方式,供开发者选择. 一.文件读取 文 ...
- tree的遍历--广度优先遍历
一.二叉树demo var tree = { value: '一', left: { value: '二', left: { value: '四', right: { value: '六' } } } ...
- CI表单验证
=================Form辅助函数==================== 1.在视图文件中导入:$this->load->helper("form") ...
- 使用redis做缓存
redis常本用来作为缓存服务器.缓存的好处是减少服务器的压力,数据查询速度快.解决数据响应慢的问题. 添加缓存:只用redis的Hash数据类型添加缓存. 例如:需要在查询的业务功能中,添加缓存 1 ...
- 【转】使用virtualenv在ubuntu上搭建python 3开发环境
ubuntu 13.04默认的python版本是2.7的,想在其上做python3的开发会遇到问题.比如要使用pip安装软件包时,默认安装的就是python2的包.如果想安装python3的包,就需要 ...
- 安卓高级2 swipeReferenceLayout 使用案例 和完善其自定义上拉
swipeReferenceLayout 无法完成上来加载数据所以自定义了一个类 Activity.java package qianfeng.com.swipelayoutdemo; import ...
- 到底什么是集群&分布式
对于楼主这样工作一年的菜鸟,偶尔会看到一些文章标题带有"分布式""集群"关键字,然后就懵逼了.最近对这些概念进行了一定的了解,整理了一下思路,在这里分享给各位猿 ...
- 计算机网络之IP协议族
网际协议IP 与IP协议配套使用的还有三个协议: 地址解析协议 ARP (Address Resolution Protocol) 网际控制报文协议 ICMP (Internet Control ...