Java基础22 网络编程(HTTP和UDP)

超详细的Java知识点路线图


前言

网络编程也是Java的拿手好戏,本文带大家了解网络的相关概念,然后实现HTTP和UDP的网络通信。

网络相关概念

网络编程,指的就是在同一个网络中不同计算机之间的数据通信

计算机网络

计算机网络,就是把分布在不同区域的计算机与专门的外部设备用通信线路相互连接成一个规模大,而且功能强的网络系统,从而使得计算机之间可以相互传递信息,共享数据、软件等资源。

计算机网络按地理位置分为:

  • 局域网
  • 城域网
  • 广域网

IP地址

IP地址指的是互联网地址(Internet Protocol Address ,是联网设备与互联网之间的唯一标识,在同一个网段中,IP地址是唯一的
IP地址是数字型的,是一个32位的二进制,通常将其分成4个8位的二进制数,每8位之间用圆点隔开,每个8位整数可以转换为一个0~255的十进制整数,例如:202.9.128.88

IP地址分类

  • A类:保留给政府结构,1.0.0.1 ~ 126.255.255.254
  • B类:分配给中型企业,128.0.0.1 ~ 191.255.255.254
  • C类:分配给任何需要的个人,192.0.0.1 ~ 223.255.255.254
  • D类:用于组播,224.0.0.1 ~ 239.255.255.254
  • E类:用于实验,240.0.0.1 ~ 255.255.255.254
  • 回收地址:127.0.0.1,指本地机,一般用于测试使用

端口

IP地址可以唯一的确定网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,此时还需要使用端口

数据的发送和接收都需要通过端口出入计算机,端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能两个程序占用同一个端口

端口号的取值范围:0 ~ 65535

端口分类:

  • 公认端口:0~1023
  • 注册端口:1025~49151
  • 动态或私有端口:1024~65535

常用端口:

  • mysql:3306
  • oracle:1521
  • tomcat:8080
  • 浏览器:80

通信协议

网络通信协议
是计算机网络中互相通信的对等实体之间交换信息时所必须遵守的规则的集合。

网络分为7层
在这里插入图片描述
常用的通信协议:

  • 传输层协议:TCP、UDP等
  • 网络层协议:IPV4、IPV6等
  • 应用层协议:HTTP、FTP、SMTP、POP3等

HTTP协议

超文本传输协议(Hyper Text Transfer Protocol)用于规范在网络中对文本数据的传输,属于应用层协议,底层是基于TCP/IP协议。

HTTP协议的特点

  1. 简单和快速
  2. 支持客户端和服务器之间的通信
  3. 无连接,一旦客户端完成访问后,和服务器的连接就会断开
  4. 无状态,服务器不会保留客户端的数据
  5. 采用请求和响应模式,客户端向服务器发送请求,服务器发送响应给浏览器。
    在这里插入图片描述

HTTP请求的方法

  • GET 数据会包含在URL里,不安全,对数据的长度有限制,适合于进行查询和搜索
  • POST 数据在后台发送,更加安全,对数据长度没有限制,适合于发送敏感数据
  • PUT 更新服务器资源
  • DELETE 请求删除资源
  • TRACE 跟踪服务器信息
  • OPTIONS 允许查看服务器的性能
  • HEAD 用于获取报头
  • CONNECT 将连接改为管道方式的代理服务器

HTTP的响应码

服务器告诉浏览器的响应结果

代码说明
1xx消息请求已被服务器接收,继续处理
2xx成功请求已成功被服务器接收、理解、并接受
3xx重定向需要后续操作才能完成这一请求
4xx请求错误请求含有词法错误或者无法被执行
5xx服务器错误服务器在处理某个正确请求时发生错误

常见响应码:

代码说明
200OK 请求成功
400Bad Request 请求有语法错误
401Unauthorized 请求未经授权
403Forbidden 服务器拒绝提供服务
404Not Found 请求资源不存在
500Internal Server Error 服务器发生错误
503Server Unavailable 服务器不能处理

HTTP网络连接

主要的API:

  • URL 资源地址
  • HttpURLConnection 网络连接

URL
统一资源定位系统(Uniform Resource Locator)是网络上用于指定信息位置的表示方法。

创建方法

URL url = new URL("资源的地址");

主要方法

  • URLConnection openConnection() 打开网络连接

HttpURLConnection

主要方法

方法作用
void disconnect()关闭连接
setRequestMethod(String method)设置请求方法
int getResponseCode()返回响应码
void setConnectTimeout(long time)设置连接超时
void setRequestProperty(String key,String value)设置请求头属性
InputStream getInputStream()获得输入流
OutputStream getOutputStream()获得输出流
void setDoOutput(boolean output)设置是否发送数据
long getContentLength()获得资源的长度

案例:从网络下载图片

  1. 创建URL对象,传入网络文件的地址
  2. 调用openConnection打开连接,获得HttpURLConnection对象
  3. 设置连接的各种属性
  4. 调用getInputStream获得输入流
  5. 创建文件输出流
  6. 从网络输入流读取数据,写入到文件输出流
  7. 关闭连接
public class DownloadTest {

	/**
	 * 下载文件
	 * @param urlStr  资源的地址
	 * @param savePath 保存的路径
	 */
	public static void download(String urlStr,String savePath){
		try {
			URL url = new URL(urlStr);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(3000); //连接超时
			conn.setRequestMethod("GET"); 
			System.out.println("文件长度是:"+conn.getContentLength());
			if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){				
				try(
					InputStream	in = conn.getInputStream();
					OutputStream out = new FileOutputStream(savePath);){
					byte[] buffer = new byte[1024];
					int len = 0;
					while((len = in.read(buffer)) != -1){
						out.write(buffer, 0, len);
					}
					System.out.println("文件下载完毕");
					Runtime.getRuntime().exec("mspaint "+savePath); //用画图打开
				}catch(IOException ex){
					ex.printStackTrace();
				}
			}
			conn.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	public static void main(String[] args) {
		download("http://hbimg.b0.upaiyun.com/a09289289df694cd6157f997ffa017cc44d4ca9e288fb-OehMYA_fw658",
				"D:\\mm.jpg");
	}
	
}

在这里插入图片描述

UDP编程

UDP是数据报协议,类似于广播,不需要三次握手来创建连接,传输数据速度快但是不可靠

应用场景:语音、视频聊天

DatagramSocket

DatagramSocket 可以做UDP的客户端也可以做服务器端

创建方法:

服务器端
new DatagramSocket(端口号)	
客户端
new DatagramSocket()	  

主要方法:

  • send(DatagramPacket) 发送数据包
  • receive(DatagramPacket) 接收数据包

DatagramPacket

DatagramPacket是UDP数据包,用于接收和发送数据

创建方法:

用于接收数据的数据包
DatagramPacket(byte[] 数据字节 ,int 数据长度)
用于发送数据的数据包
DatagramPacket(byte[] 数据字节 ,int 数据长度,InetAddress 地址,int 端口)

常用方法:

  • byte[] getData() 获得数据

UDP通信

使用UDP发送简单的消息

UDP服务器端

public class UDPServer {

	public static final int PORT = 8888;
	
	public void start(){
		System.out.println("server started!");
		try {
			//创建UDP服务端
			DatagramSocket server = new DatagramSocket(PORT);
			//创建数据包
			byte[] buf = new byte[1024];
			DatagramPacket packet = new DatagramPacket(buf, buf.length);
			//接收数据包
			server.receive(packet);
			String str = new String(packet.getData());
			System.out.println("收到消息:" + str);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		new UDPServer().start();
	}

}

UDP客户端

public class UDPClient {

	public void sendMsg(String ip,int port,String msg){
		try {
			//创建UDP客户端
			DatagramSocket client = new DatagramSocket();
			//创建数据包
			byte[] buf = msg.getBytes();
			DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName(ip),port);
			//发送数据包
			client.send(packet);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		new UDPClient().sendMsg("127.0.0.1", 8888, "Hello UDP!");
	}
}

结束


大家如果需要学习其他Java知识点,戳这里 超详细的Java知识点汇总

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以回答这个问题。UDP是一个无连接的协议,它不保证数据包的可靠传输,也不保证数据包的顺序。因此,在使用UDP进行网络通信时,需要注意以下几点: 1. UDP数据包的大小是有限制的,一般情况下不能超过64K。 2. 接收UDP数据包时,需要使用一个固定大小的缓冲区,来存储接收到的数据。如果数据包的大小超过了缓冲区的大小,那么多余的数据将被丢弃。 3. 接收UDP数据包时,需要使用一个循环来不断地接收数据,直到接收到完整的数据包为止。 下面是一个简单的Java UDP接收程序的示例代码: ```java import java.net.*; public class UDPReceiver { public static void main(String[] args) { try { DatagramSocket socket = new DatagramSocket(9999); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while (true) { socket.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); System.out.println("Received message: " + message); } } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个示例程序中,我们创建了一个DatagramSocket对象,并绑定到了本地的9999端口。然后我们创建了一个缓冲区,用来存储接收到的数据。接着,我们创建了一个DatagramPacket对象,用来接收数据。在循环中,我们使用socket.receive()方法来接收数据包,并将数据存储在packet对象中。最后,我们将接收到的数据转换成字符串,并输出到控制台上。 希望这个示例程序可以帮助你理解UDP网络通信的基本原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恒哥~Bingo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值