1、Java URL处理
URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址。表示为互联网上的资源,如网页或者FTP地址。
HTTP 协议的 URL 实例如下:
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
2、URL 类
2.1、URL类概述及常用方法
在java.net包中定义了URL类,该类用来处理有关URL的内容。对于URL类的创建和使用,下面分别进行介绍。
java.net.URL提供了丰富的URL构建方式,并可以通过java.net.URL来获取资源。
方法 | 作用 |
public URL(String url) throws MalformedURLException | 通过给定的URL字符串创建URL |
public String getPath() | 返回URL路径部分。 |
public URLConnection openConnection() throws IOException | 打开一个URL连接,并运行客户端访问资源。 |
2.2、URL类方法使用
***示例:***通过URL地址获取网页资源(通过网页图片资源进行展示);
源代码如下:
/*
* URL
* 网页图片下载
*/
public class Demo_12 {
public static void main(String[] args) {
BufferedInputStream bin = null;
BufferedOutputStream bos = null;
try {
//创建URL对象
URL imgUrl = new URL("https://upload.jianshu.io/users/upload_avatars/24120701/4f8929c0-7429-412d-b482-5a705d86eb35.jpg");
//创建访问连接
HttpURLConnection connection = (HttpURLConnection)imgUrl.openConnection();
System.out.println("图片下载中········");
//通过访问连接读取图片
bin = new BufferedInputStream(connection.getInputStream());
// 向本地文件写入
bos = new BufferedOutputStream(new FileOutputStream(new File("D:\\c\\图片.jpg")));
//进行边读边写操作
byte data[] = new byte[1024];
int length = -1;
while((length = bin.read(data)) != -1) {
bos.write(data,0,length);
}
System.out.println("图片下载完成!");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流
try {
bos.close();
} catch (IOException e) {
bos = null;
e.printStackTrace();
}
try {
bin.close();
} catch (IOException e) {
bin = null;
e.printStackTrace();
}
}
}
}
运行后效果如下:
可以看到我们通过URL成功的完成了图片的获取。
3、UDP
3.1、UDP概述
UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
UDP相关类 | 用途 |
InetAddress | 用于描述和包装一个Internet IP地址 |
DatagramSocket | 用于接收和发送UDP的Socket实例。 |
DatagramPacket | 用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。 |
相关类的用法以及常用方法通过以下实例展示解释:
/*
* UDP协议
* DatagramPacket类:封装数据
* DatagramSocket类: 数据的收发
*/
public class Demo06 {
public static void main(String[] args) {
/*
* 数据的收取
*/
// DatagramSocket建立基于UDP协议的连接
try (DatagramSocket socket = new DatagramSocket(8889)){
//1.创建空的DatagramPacket数据包
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
//2.接收信息
//DatagramSocket将接收到的信息,存入DatagramPacket数据
socket.receive(packet);
//3.获取数据包中的数据
//3.1获取数据包中的数据部分
data = packet.getData();
//3.2获取数据包中的数据字节长度
int length = packet.getLength();
String result = new String(data,0,length);
//3.3获取发送端的信息
InetAddress address = packet.getAddress();
System.out.println("发送端:" + address.getHostAddress());
System.out.println("发送信息:" + result);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
public class UdpDemo {
public static void main(String[] args) {
/*
* UPD协议下的数据发送
*/
try (DatagramSocket socket = new DatagramSocket();){
//1.创建DatagramPacket数据包
byte[] data = "你好".getBytes();
//发送的目标地址
InetAddress targetHost = InetAddress.getByName("localhost");
//DatagramPacket对象中包含:发送的数据字节数组、目标地址、目标端口
DatagramPacket packet = new DatagramPacket(data, data.length, targetHost, 8889);
//2.使用Socket发送DatagramPacket数据包
socket.send(packet);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试结果:
3.2、UDP协议
- UDP,用户数据报协议,它是TCP/IP协议簇中无连接的运输层协议。
- UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
- 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务器可同时向多个客户端传输相同的消息。
UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。- 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
- UDP使用尽量最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表。
- UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部受就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小
4、TCP与UDP的区别
- TCP基于连接,UDP是无连接的;
- 对系统资源的要求,TCP较多,UDP较少;
- UDP程序结构较简单;
- TCP是流模式,而UDP是数据报模式;
- TCP保证数据正确性,而UDP可能丢包;TCP保证数据顺序,而UDP不保证;