网络编程_Part5_Internet编程基础

本文深入解析了URL的组成部分及其编码规则,详细介绍了HTTP协议的工作原理和会话过程,并通过Java代码实例展示了如何使用HttpURLConnection对象获取指定服务器上的资源,包括请求消息头、服务器返回的消息头和实体内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URL

URL的中文全称为全球统一定位符,它主要由以下几个部分组成:

协议  主机名  :端口号   资源名

举例说明:有一个URL为http://192.168.0.1:8080/index.jsp

那么在这个URL中,http表示协议,192.168.0.1表示主机名,8080表示需要访问的端口号,index.jsp表示需要获取的资源名

在URL中,协议名和主机名对大小写不敏感,资源名对大小写往往是敏感的

相对URL:

为了扩展URL可以访问的资源范围,还可以使用相对URL来访问服务器上的资源

相对URL的格式通常为/a.html    ../a.html   a.html之类,表示需要访问服务器上的哪个资源

其中/a.html  ../a.html是相对路径,相对路径指的就是相对于服务器所在的路径来说,该资源在什么地方

URL编码规则:

1、将空格转换为加号("+")

2、a-z  A-Z  0-9保持不变

3、对于所有其他的字符,均转换成这个字符的当前字符集编码在内存中的16进制数表示,并在每个字节前面加上一个"%"

例如:字符"+"用%2B表示,每个中文字符在内存中占有2个字节,例如“中”就用%D6%D0表示

*在java.net包中提供了URLDecoder和URLEncoder两个类,来实现URL编码和解码


HTTP协议

HTTP协议规定了www浏览器从网络上获取网页的形式

当使用HTTP协议获取网络上的某个服务器上的资源时,如果不指定访问服务器的哪个端口号,那么HTTP协议就会自动访问服务器的80端口

HTTP协议的会话过程:

目前所使用的HTTP协议版本为HTTP1.1,该版本最大的特点是支持持久连接

在HTTP1.0中,客户端每次向服务器端发送请求时,只要服务器返回了客户端请求的数据,客户端就会自动断开与服务器端的连接

而在HTTP1.1中,客户端会首先与服务器建立连接,然后就可以通过这个连接与服务器进行通信,最后客户端再主动断开与服务器的连接

一个完整的HTTP请求消息中,包括一个请求行,若干消息头,以及请求内容

一个完整的HTTP响应消息中,包括一个状态行,若干消息头,以及实体内容

其中消息头之间是一行行隔开的,消息头和内容之间也有一个空行

几个常用的HTTP消息头:

Connection:指定处理完本次请求/响应后,客户端和服务器是否还保持连接,设置值可为Keep-Alive和close

Accept-Language:用于指出客户端希望服务器返回的文档所使用的国家语言,可以指定多个以逗号分隔的国家语言

Content-Length:用于表示实体内容的长度(字节数)

Range:用于指定服务器只需要返回文档中部分内容及内容范围,可以指定A-B,A-和-B三种格式

Content-Range:用于指定服务器返回的部分实体内容的位置信息,例如Content-Range:bytes 2543-4532/7898,其中7898为总字节数


编程实例:

通过HttpURLConnection对象连接到Google服务器,请求获取简体中文页面

并打印出请求的消息头,Google服务器返回的消息头和实体内容

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class GetGoogle {
	public static void main(String args[]) throws Exception{
		getContentByLanguage("ja");
	}
	
	public static void getContentByLanguage(String country) throws Exception{
		//创建URL请求对象,并设置请求参数
		URL urlGoogle = new URL("http://www.google.com.hk");
		HttpURLConnection googleConnection = (HttpURLConnection)urlGoogle.openConnection();
		googleConnection.setRequestProperty("Accept-Language", country); //设置请求参数
		
		//获取所有的请求参数列表,并遍历打印出其中所有的参数值
		Map <String, List<String>> requestMap = googleConnection.getRequestProperties();
		Set <String> requestKeys = requestMap.keySet();
		System.out.println("===========requestFields===========");
		for (String key: requestKeys) {
			System.out.println(key + " : " + googleConnection.getRequestProperty(key));
		}
		
		//获取服务器返回的所有应答参数列表,并遍历打印出所有的参数值
		Map <String, List<String>> responseMap = googleConnection.getHeaderFields();
		Set <String> responseKeys = responseMap.keySet();
		System.out.println("===========responseFields===========");
		for (String key: responseKeys) {
			System.out.println(key + " : " + googleConnection.getHeaderField(key));
		}
		
		//获取Conncection的输入流,并通过输入流从目标网页上读取内容
		InputStream in = googleConnection.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		System.out.println("===========pageContent===========");
		String strLine = br.readLine();
		while (strLine != null) {
			System.out.println(strLine);
			strLine = br.readLine();
		}
		
		//释放资源
		br.close();
		googleConnection.disconnect();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值