提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1.网络编程概述
    • 1.1 什么是网络
    • 1.2 网络编程的三要素
    • 1.3 IP地址
    • 1.4 端口号
    • 1.5 协议
  • 2.通信程序
    • 2.1 InetAddress类
    • 2.2 UDP通信程序
      • 2.2.1 概述
      • 2.2.2 UDP 发送端程序
      • 2.2.3 UDP 接收端程序
      • 2.2.4 UDP 的通信方式
    • 2.3 TCP 通信程序
      • 2.3.1 概述
      • 2.3.2 TCP 客户端程序
      • 2.3.3 TCP 服务端程序
      • 2.3.4 综合案例
  • 3.URL编程
    • 3.1 URL类相关概述
    • 3.1 URL 构造方法
    • 3.2 URL 常用的方法
    • 3.3 URLConnection 类
    • 3.4 HTTP的请求与响应信息
      • 3.4.1 请求信息
      • 3.4.2 响应信息
    • 3.5 综合案例
      • 3.5.1 案例描述
      • 3.5.1 环境准备
    • 3.5.1 代码编写

1.网络编程概述

1.1 什么是网络

计算机网络: 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系 统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程: 在网络通信协议下,不同计算机上运行的程序,可以进行数据传输。

1.2 网络编程的三要素

IP地址: 要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数 据的计算机和识别发送的计算机,而IP地址就是这个标识号。也就是设备的标识。

端口号: 网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网络通信时,如何区 分这些应用程序呢?如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序 了。也就是应用程序的标识

协议: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定 的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则 被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守 才能完成数据交换。常见的协议有UDP协议和TCP协议

1.3 IP地址

IP地址: 是计算机在网络中的唯一标识。

IP地址的分类:

  • IPV4: 0 00000001 01000010”,这么长的地址,处理起来也太费劲了。为了方便使用,IP地址经常被写成十进制 的形式,中间使用符号“.”分隔不同的字节。于是,上面的IP地址可以表示为“192.168.1.66”。IP地址的这 种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多
  • IPV6: 由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发 紧张。为了扩大地址空间,通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8 组十六进制数,这样就解决了网络地址资源数量不够的问题

查看IP地址的Dos命令:

  • ipconfig:查看本机IP地址
  • ping IP地址:检查网络是否连通

特殊的IP地址: 127.0.0.1 是回送地址,可以代表本机地址,一般用来测试使用

1.4 端口号

端口: 是计算机中程序的唯一标识。

端口号: 用两个字节表示的整数,它的取值范围是065535。其中,01023之间的端口号用于一些知名的网络服 务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会 导致当前程序启动失败

1.5 协议

概述: 是计算机在网络中连接通信要遵守的一种规则。

UDP协议:

  • 用户数据报协议(User Datagram Protocol)
  • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台 计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在 收到数据时,也不会向发送端反馈是否收到数据。
  • 由于使用UDP协议消耗系统资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
  • 例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太 大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在 传输重要数据时不建议使用UDP协议

TCP协议:

  • 传输控制协议 (Transmission Control Protocol)

  • TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数 据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由 客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”

  • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠

    第一次握手,客户端向服务器端发出连接请求,等待服务器确认

    第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

    第三次握手,客户端再次向服务器端发送确认信息,确认连接

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hc256m79-1661415969070)(1.三次握手.png)]

  • 完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性, TCP协议可以保证传输数据的安全,所以应用十分广泛。例如上传文件、下载文件、浏览网页等

  • 通信完毕后进行四次挥手:

    第一次挥手,客户端向服务器发送断开连接请求,等待服务器确认

    第二次挥手,服务器向客户端送出一个响应,通知客户端收到请求。

    第三次挥手,服务器向客户端确认数据,并通知客户端可以断开连接。

    第四次挥手,客户端再次向服务器发送请求,确认断开连接。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2vKAagZ-1661415969072)(2.四次挥手.png)]

2.通信程序

2.1 InetAddress类

概述: 此类表示互联网协议 (IP) 地址。

IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。IP 地址的体系结构是由 RFC 790:Assigned NumbersRFC 1918:Address Allocation for Private InternetsRFC 2365:Administratively Scoped IP MulticastRFC 2373:IP Version 6 Addressing Architecture 定义的。InetAddress 的实例包含 IP 地址,还可能包含相应的主机名(取决于它是否用主机名构造或者是否已执行反向主机名解析)。

常用的方法:

static InetAddress getByName(String host) : 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
static InetAddress getLocalHost() : 返回本机IP地址信息
String getHostName() : 获取此IP地址的主机名
String getHostAddress() : 返回文本显示中的IP地址字符串

案例:

public class Demo01 {public static void main(String[] args) throws UnknownHostException {// 获取对象InetAddress byName = InetAddress.getByName("168.127.11.14");System.out.println("byName = " + byName);InetAddress localHost = InetAddress.getLocalHost();System.out.println("localHost = " + localHost);// 获取主机名String hostName = byName.getHostName();System.out.println("hostName = " + hostName);// 获取Ip地址String hostAddress = byName.getHostAddress();System.out.println("hostAddress = " + hostAddress);}
}

2.2 UDP通信程序

2.2.1 概述

基本概述: UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发 送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念 。Java提供了DatagramSocket类作为基于UDP协议的Socket。

DatagramSocket类

此类表示用来发送和接收数据报包的套接字。 数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。 在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。

DatagramPacket类

此类表示数据报包。 数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。

2.2.2 UDP 发送端程序

常用的方法:

-- DatagramSocket类 :** 构造方法public DatagramSocket() : 构造数据报套接字并将其绑定到本地主机上任何可用的端口。public DatagramSocket(int port) : 创建数据报套接字并将其绑定到本地主机上的指定端口。** 常用的方法void send(DatagramPacket p) : 从此套接字发送数据报包。 void close() : 释放资源-- DatagramPacket类 :** 构造方法public DatagramPacket(byte[] buf, // 要发送的数据int offset, // 从数组那个索引开始int length, // 发送数据的长度InetAddress address, // 接收端的ip地址int port // 接收端的端口号) : 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。

发送数据的步骤:

1.创建一个发送端的套接字对象(可绑定端口)。

2.创建数据包,封装相应的数据。

3.发送数据。

4.释放资源

public class SenderDemo {public static void main(String[] args) throws IOException {//1.创建一个发送端的套接字对象(可绑定端口)。DatagramSocket ds = new DatagramSocket();//2.创建数据包,封装相应的数据。// 要发送的数据byte[] bytes = "Hello Word~~".getBytes();// 接收端的地址InetAddress ip = InetAddress.getByName("192.168.11.24");// 接收端的端口int prot = 3000;DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length,ip,prot);//3.发送数据。ds.send(dp);//4.释放资源ds.close();}
}

2.2.3 UDP 接收端程序

常用的方法:

-- DatagramSocket类 :** 构造方法public DatagramSocket(int port) : 创建数据报套接字并将其绑定到本地主机上的指定端口。** 常用的方法void receive(DatagramPacket p) : 从此套接字接收数据报包。 void close() : 释放资源-- DatagramPacket类 :** 构造方法public DatagramPacket(byte[] buf, int length) : 构造 DatagramPacket,用来接收长度为 length 的数据包public DatagramPacket(byte[] buf, int offset, int length) : 构造 DatagramPacket,用来接收长度为 length         的包,在缓冲区中指定了偏移量。。** 常用的方法int getLength() : 返回将要发送或接收到的数据的长度。 int getPort() : 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的 InetAddress getAddress() : 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 byte[] getData() : 返回数据缓冲区。

接收的步骤:

1.创建接收端的Socket对象(DatagramSocket)

2.创建一个数据包,用于接收数据

3.调用DatagramSocket对象的方法接收数据

4.解析数据包,并把数据在控制台显示

5.关闭接收端

public class ReceiverDemo {public static void main(String[] args) throws IOException {// 1.创建接收端的Socket对象(DatagramSocket)DatagramSocket ds = new DatagramSocket(3000);// 2.创建一个数据包,用于接收数据// 接收数的数组byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, 0, bytes.length);// 3.调用DatagramSocket对象的方法接收数据ds.receive(dp);// 4.解析数据包,并把数据在控制台显示int length = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("发送端的地址: " + address);System.out.println("发送端的端口: " + port);String string = new String(bytes,0,length);System.out.println("发送的内容:" + string);// 5.关闭接收端ds.close();}
}

2.2.4 UDP 的通信方式

单播 : 单播用于两个主机之间的端对端通信

组播 : 组播用于对一组特定的主机进行通信 广播

广播 : 用于一个主机对整个局域网上所有主机上的数据通信

2.3 TCP 通信程序

2.3.1 概述

Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过 Socket产生IO流来进行网络通信。

Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

2.3.2 TCP 客户端程序

Socket类

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

常用的方法:

-- 构造方法public Socket(InetAddress address, int port) : 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。public Socket(String host, int port) : 创建一个流套接字并将其连接到指定主机上的指定端口号。-- 常用的方法OutputStream getOutputStream() : 返回此套接字的输出流。InputStream getInputStream() : 返回此套接字的输入流。 void close() : 释放资源。

使用步骤:

1.创建客户端的Socket对象(Socket

2.获取输出流,写数据

3.释放资源

public class ClientDemo {public static void main(String[] args) throws IOException {// 1.创建客户端的Socket对象(Socket)Socket socket = new Socket("192.168.11.24", 3000);// 2.获取输出流,写数据OutputStream os = socket.getOutputStream();os.write("Hello Word".getBytes());// 3.释放资源socket.close();os.close();}
}

2.3.3 TCP 服务端程序

Socket类

// 这里的对象是根据ServerSocket类中的方法获得
-- 常用的方法OutputStream getOutputStream() : 返回此套接字的输出流。InputStream getInputStream() : 返回此套接字的输入流。InetAddress getLocalAddress() : 获取套接字绑定的本地地址。 int getLocalPort() : 返回此套接字绑定到的本地端口。

ServerSocket类:

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。

-- 构造方法public ServerSocket(int port) : 创建绑定到特定端口的服务器套接字。-- 常用的方法Socket accept() : 侦听并接受到此套接字的连接。 void close() : 释放资源InetAddress getInetAddress() : 返回此服务器套接字的本地地址。 int getLocalPort() : 返回此套接字在其上侦听的端口。

服务端程序实现步骤:

1.创建套接字服务器对象,绑定端口

2.侦听并接受到此套接字的连接,创建Socket对象

3.返回此套接字的输入流。

4.解析数据

5.释放资源

public class ServerDemo {public static void main(String[] args) throws IOException {//1.创建套接字服务器对象,绑定端口ServerSocket serverSocket = new ServerSocket(3000);//2.侦听并接受到此套接字的连接,创建Socket对象Socket socket = serverSocket.accept();//3.返回此套接字的输入流。InputStream is = socket.getInputStream();//4.解析数据byte[] bytes = new byte[1023];int len = is.read(bytes);String data = new String(bytes, 0, len);InetAddress inetAddress = socket.getInetAddress();System.out.println("IP地址:" + inetAddress);int port = socket.getPort();System.out.println("端口:" + port);System.out.println("数据: " + data);//5.释放资源serverSocket.close();socket.close();is.close();}
}

注意事项

  1. accept方法是阻塞的,作用就是等待客户端连接
  2. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接
  3. 针对客户端来讲,是往外写的,所以是输出流 针对服务器来讲,是往里读的,所以是输入流
  4. read方法也是阻塞的
  5. 客户端在关流的时候,还多了一个往服务器写结束标记的动作
  6. 最后一步断开连接,通过四次挥手协议保证连接终止

2.3.4 综合案例

案例描述: 模拟网盘上传文件操作

客户端操作:

public class Client {public static void main(String[] args) throws IOException {// 1.创建客户端的Socket对象(Socket),并创建传输流Socket socket = new Socket("192.168.11.24", 3000);OutputStream os = socket.getOutputStream();// 2. 先发送一次,发送文件相关信息// a、创建File对象,指定文件路径File file = new File("C:\\Users\\86150\\Desktop\\壁纸\\wallhaven-y8y22l.jpg");// b、获取名称格式String fileName = file.getName();// c、发送文件信息os.write(fileName.getBytes());// 3.结果反馈InputStream is = socket.getInputStream();byte[] result = new byte[1024];int resultlen = is.read(result);String resultStr = new String(result, 0, resultlen);System.out.println("上传反馈:" + resultStr);// 4.在发送一次,发送文件内容// a、创建文件字节输入流FileInputStream fis = new FileInputStream(file);//b、循环读写内容,将内容发送到服务器byte[] fileBys = new byte[1024];int fileLen;while((fileLen = fis.read(fileBys)) != -1){os.write(fileBys,0,fileLen);}// 释放资源socket.close();os.close();fis.close();is.close();}
}

服务端操作:

public class Server {public static void main(String[] args) {try {//1.创建套接字服务器对象,绑定端口ServerSocket serverSocket = new ServerSocket(3000);//2.侦听并接受到此套接字的连接,创建Socket对象,并创建传输流Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();//3.接收文件信息byte[] names = new byte[1024];int namesLen = is.read(names);String fileName = new String(names, 0, namesLen);System.out.println("fileName = " + fileName);// 4.若无异常,反馈上传成功System.out.println("文件已上传 : " + fileName);OutputStream os = socket.getOutputStream();os.write("上传成功~~".getBytes());//5.接收文件内容// a.创建文件输出流,将文件读取到本地FileOutputStream fos = new FileOutputStream("C:\\Users\\86150\\Desktop\\服务器文件夹\\" + fileName);// b.循环读取,并写入byte[] fileBys = new byte[1024];int fileLen;while ((fileLen = is.read(fileBys)) != -1){fos.write(fileBys,0,fileLen);}//6.释放资源serverSocket.close();socket.close();is.close();fos.close();os.close();} catch (Exception e) {System.out.println("上传失败~~~");}}
}

3.URL编程

3.1 URL类相关概述

  • URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一 资源的地址。
  • 它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate 这个资源。
  • 通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
  • URL的基本结构由5部分组成:<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
  • URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
  • URL类的构造器都声明抛出非运行时异常,必须要对这一异常进行处理,通 常是用 try-catch 语句进行捕获。

3.1 URL 构造方法

语法格式

public URL(String spec) : 根据 String 表示形式创建 URL 对象。
public URL(String protocol, String host, int port, String file)根据指定 protocol、host、port 号和 file 创建 URL 对象。
public URL(String protocol, String host, int port, String file, URLStreamHandler handler) 根据指定的 protocol、host、port 号、file 和 handler 创建 URL 对象
public URL(String protocol, String host, String file) 根据指定的 protocol 名称、host 名称和 file 名称创建 URL。
public URL(URL context, String spec) 通过在指定的上下文中对给定的 spec 进行解析创建 URL。
public URL(URL context, String spec, URLStreamHandler handler) 通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL。

代码演示

public static void main(String[] args){URL url = new URL ("http://www.baidu.com"); URL downloadUrl = new URL(url, "download.html");URL url2 = new URL("http","www.baidu.com", "download.html");URL gamelan = new URL("http", "www.baidu.com", 80, "download.html");
}

3.2 URL 常用的方法

常用的基本方法

返回值 方法 功能描述
String getAuthority() 获取此 URL 的授权部分。
Object getContent]() 获取此 URL 的内容。
Object getContent(Class[] classes) 获取此 URL 的内容。
int getDefaultPort() 获取与此 URL 关联协议的默认端口号。
String getFile() 获取此 URL的文件名。
String getHost() 获取此 URL的主机名(如果适用)。
String getPath() 获取此 URL 的路径部分。
int getPort() 获取此 URL 的端口号。
String getProtocol() 获取此 URL 的协议名称。
String getQuery() 获取此 URL 的查询部分。
String getRef() 获取此 URL 的锚点(也称为“引用”)。
String getUserInfo() 获取此 URL 的 userInfo 部分。
int hashCode() 创建一个适合哈希表索引的整数。

代码演示

URL url = new URL("http://localhost:8080/webStu/test.html");
System.out.println("getProtocol() :"+url.getProtocol());
System.out.println("getHost() :"+url.getHost());
System.out.println("getPort() :"+url.getPort());
System.out.println("getPath() :"+url.getPath());
System.out.println("getFile() :"+url.getFile());
System.out.println("getQuery() :"+url.getQuery());

三个特殊的方法

返回值类型 方法 功能描述
URLConnection openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
URLConnection openConnection(Proxy proxy) 与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。
InputStream openStream() 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream,能从网上获取数据。

代码演示和下面所学的URLConnection类一起演示。

3.3 URLConnection 类

  • 若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一 些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。

  • URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时, 首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException.

  • 抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:

    1.通过在 URL 上调用 openConnection 方法创建连接对象。
    2.处理设置参数和一般请求属性。
    3.使用 connect 方法建立到远程对象的实际连接。
    4.远程对象变为可用。远程对象的头字段和内容变为可访问。
    

使用以下方法修改设置参数:

返回值 方法 描述
void setAllowUserInteraction(boolean allowUserInteraction) 设置此 URLConnectionallowUserInteraction 字段的值。
void setDoInput(boolean doinput) 将此 URLConnectiondoInput 字段的值设置为指定的值。
void setIfModifiedSince(long ifModifiedSince) 将此 URLConnectionifModifiedSince 字段的值设置为指定的值。
void setUseCaches(boolean usecaches) 将此 URLConnectionuseCaches 字段的值设置为指定的值。
void setRequestProperty(String key, String value) 设置一般请求属性。

在建立到远程对象的连接后,以下方法用于访问头字段和内容:

返回值 方法 描述
boolean getAllowUserInteraction() 返回此对象的 allowUserInteraction 字段的值。
int getConnectTimeout() 返回连接超时设置。
Object getContent() 获取此 URL 连接的内容。
Object getContent(Class[] classes) 获取此 URL 连接的内容。
String getContentEncoding() 返回 content-encoding 头字段的值。
int getContentLength() 返回 content-length 头字段的值。
String getContentType() 返回 content-type 头字段的值。
String getDate() 返回 date 头字段的值。
long getExpiration() 返回 expires 头字段的值。
static FileNameMap getFileNameMap() 从数据文件加载文件名映射(一个 mimetable)。
String getHeaderField(int n) 返回第 n 个头字段的值。
String getHeaderField(String name) 返回指定的头字段的值。
long getHeaderFieldDate(String name, long Default) 返回解析为日期的指定字段的值。
int getHeaderFieldInt(String name, int Default) 返回解析为数字的指定字段的值。
String getHeaderFieldKey(int n) 返回第 n 个头字段的键。
Map<String,List<String>> getHeaderFields() 返回头字段的不可修改的 Map。
long getIfModifiedSince() 返回此对象的 ifModifiedSince 字段的值。
InputStream getInputStream() 返回从此打开的连接读取的输入流。
long getLastModified() 返回 last-modified 头字段的值。
OutputStream getOutputStream() 返回写入到此连接的输出流。
Permission getPermission() 返回一个权限对象,其代表建立此对象表示的连接所需的权限。
int getReadTimeout() 返回读入超时设置。
Map<String,List<String>> getRequestProperties() 返回一个由此连接的一般请求属性构成的不可修改的 Map。
String getRequestProperty(String key) 返回此连接指定的一般请求属性值。
URL getURL() 返回此 URLConnectionURL 字段的值。
boolean getUseCaches() 返回此 URLConnectionuseCaches 字段的值。

以上的方法不是所有的都常用,有的方法基本上只是提供了解而已。

3.4 HTTP的请求与响应信息

3.4.1 请求信息

  • 组成: 请求行、请求头、请求空行、请求体

  • 请求行

    • 格式:

    • 请求方式:GET,POST,HEAD,PUT,DELETE,CONNECT,OPTIONS,TRACE,PATCH 其中用的比较多的是GET和POST

    • url:请求资源路径,统一资源标识符

  • 请求头

    • 格式:

    • 请求头名称

      Host: 用来指定请求的服务端地址
      Connection: 取值为keep-alive表示需要持久连接
      User-Agent: 客户端的信息
      Accept: 指定客户端能够接收的内容类型
      Accept-Encoding: 指定浏览器可以支持的服务器返回内容压缩编码类型
      Accept-Language: 浏览器可接受的语言
      

3.4.2 响应信息

  • 组成: 响应行、响应头、响应空行、响应体

  • 响应行

    • 格式

    • 响应状态码

      1xx: 指示信息(表示请求已接收,继续处理)
      2xx: 成功(表示请求已被成功接收、理解、接受)
      3xx: 请求重定向(要完成请求必须进行更进一步的操作)
      4xx: 客户端错误(请求有语法错误或请求无法实现)
      5xx: 服务器端错误(服务器未能实现合法的请求)
      
    • 状态信息

      200 ok
      404 Not Found
      500 Internal Server Error
      
  • 响应头

    • 响应头名称:Content-Type: 告诉客户端实际返回内容的网络媒体类型(互联网媒体类型,也叫做MIME类型)

    • 响应头值:

      text/html ----> 文本类型
      image/png ----> png格式文件
      image/jpeg ----> jpg格式文件
      
  • 版本协议

    • HTTP1.0: 每次请求和响应都需要建立一个单独的连接
    • HTTP1.1: 支持长连接

3.5 综合案例

3.5.1 案例描述

通过URL技术获取到服务中网页的内容。内容如图所示:

3.5.1 环境准备

部署一个nginx服务器,在服务器下编写一个test.html文件,内容如上图所示

text.html代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>h1 , h5{text-align: center;}div {text-align: center;}</style>
</head><body><h1>《青溪》</h1><h5>作者:王维</h5><div><p>言入黄花川,每逐青溪水。</p><p> 随山将万转,趣途无百里。</p><p> 声喧乱石中,色静深松里。</p><p> 漾漾泛菱荇,澄澄映葭苇。</p><p> 我心素已闲,清川澹如此。</p><p> 请留盘石上,垂钓将已矣。</p></div>
</body>
</html>

通过浏览器地址url路径访问nginx服务器,来显示test.html页面

3.5.1 代码编写

开发步骤:

  1. 根据服务器地址,创建URL对象:建立引用出现与服务器的连接通道
  2. 打开与URL之间的连接通道:打开应用程序与URL之间的连接通道
  3. 设置请求属性:http的请求头信息
  4. 建立实际连接:应用程序与服务器进行实际连接
  5. 获取所有响应字段头
  6. 通过字节输入流接收网页数据(BufferString)接收
  7. 后续步骤与IO相关就不赘叙了
public static void main(String[] args) {String realUrl = "http://localhost/webstu/test.html";try {// 1. 根据服务器地址,创建URL对象:建立引用出现与服务器的连接通道URL url = new URL(realUrl);// 2. 打开与URL之间的连接通道:打开应用程序与URL之间的连接通道URLConnection connection = url.openConnection();// 3. 设置请求属性:http的请求头信息connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 4. 建立实际连接:应用程序与服务器进行实际连接connection.connect();// 5. 获取所有响应字段头Map<String, List<String>> headerFields = connection.getHeaderFields();System.out.println("headerFields = " + headerFields);// 6. 通过字节输入流接收网页数据(StringBuffer)接收InputStream inputStream = connection.getInputStream();// 7.剩余的步骤就与IO相关了BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));StringBuffer webHtml = new StringBuffer();String line = null;while ((line = reader.readLine()) != null){webHtml.append(line);}System.out.println(webHtml.toString());// 8.释放资源reader.close();} catch (Exception e) {e.printStackTrace();}
}

JavaSE - 11 网络编程相关推荐

  1. JavaSE高级 网络编程

    JavaSE高级 网络编程 教学目标 能够辨别UDP和TCP协议特点 UDP 无连接,基于数据包,发出去就不管了,性能好,可能丢失数据. TCP有连接,基于通信管道,可靠传输. 能够说出TCP协议下两 ...

  2. JavaSE:网络编程

    JavaSE:网络编程 文章目录 前言 一.网络编程概述 二.网络通信的要素 三.IP 四.端口 五.通信协议 六.TCP 1. 发送接收消息 2. 文件上传 3. 初识Tomcat 七.UDP 1. ...

  3. JAVA基础11 网络编程

    JAVA基础 11.网络编程 1.什么是网络?网络模型?网络四要素? 1.网络 在计算机领域中网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 资源的 ...

  4. 11.网络编程的学习总结

    11.网络编程 1.什么是网络?网络模型?网络四要素? 网络: 在计算机领域中网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 1.资源的共享 2.免 ...

  5. 【JavaSE】网络编程 Jpcap的使用

    [JavaSE]网络编程 Jpcap的使用 前言:由于之前课程需要做个网络课程设计,题目是IP数据包的捕获与解析,考虑再三之后选择用Java来做(主要是因为Java界面比较好写,个人这么觉得),于是在 ...

  6. 【JavaSE】网络编程(606~630)

    606.IO流与网络编程-每天一考 说明流的三种方式 流向:输入流.输出流 数据单位:字节流.字符流 流的单位:节点流.处理流 写出4个IO流中抽象基类,4个文件流,4个缓冲流 抽象基类:InputS ...

  7. 【JavaSe】网络编程篇(一) 网络编程入门

    JavaSe·网络编程篇(一) 网络编程入门 1. 软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.百度网盘等软件 B/S结构 :全称为Browse ...

  8. 11.网络编程-基础知识 C++/Linux-2022-10-20

    linux网络编程 1.网络基础 网络应用程序设计模式 C/S - client/sercver 优点:1.协议选用灵活,2.可以缓存数据 缺点:用户安全,开发工作量大,调试困难 B/S - brow ...

  9. 【Socket网络编程】11.网络编程中的 数据封装 和 数据拆封

    搭配这篇博文服用,效果更好:以太网数据包.IP数据包.UDP数据包:https://blog.csdn.net/u011754972/article/details/116030526 1.数据封装: ...

最新文章

  1. Nginx-场景实践篇
  2. 相机原理updateTexImage
  3. sql 定时同步两个数据库
  4. shell连接工具_无需本地软件,只用浏览器就能连接并控制安卓手机
  5. spring4.x注解概述
  6. Intel Realsense D435 python 测试是否能将pipeline、config、enable、start单独提出wait for frames循环外?(不能,配置必须全部在外)
  7. idea 中使用 jetty 插件
  8. Mac DBeaver Client home is not specified for connection解决办法
  9. MyEclipse 6.0 注册码
  10. 沪深股票历史数据下载,股票历史交易数据下载
  11. win10激活方法 电脑病毒和防威胁按键是灰色的,密钥无效的,无法激活的时候怎么强制激活电脑系统
  12. 检测压缩包并处理的Linux脚本(解压、批量修改文件名、导入)分析
  13. 自主上传图片投票工具、上传图片投票小程序、上传图片投票平台
  14. 【保姆级教程,100%成功】MAC OS打开ntfs格式U盘
  15. Qt【正则表达式】匹配中文汉字,和字母,过滤中英文符号
  16. ThinkPad平板电脑在定价上还存在的一个问题是
  17. 计算机的硬件系统和软件系统的关系
  18. 【冒泡排序Java版】
  19. http 304响应的理解
  20. 计算机毕业设计Node.js+Express校园快递代取系统(源码+程序+lw+远程调试)

热门文章

  1. Ngxin禁止IP+端口号访问系统,设置只能通过域名访问
  2. Sprite Kit教程:动画和纹理图集 2
  3. JS 哪些事件支持冒泡
  4. Metrics介绍和Spring的集成
  5. 微信小程序版本更新提示
  6. linux中quota信息查看,quota命令_Linux quota命令使用详解:显示磁盘已使用的空间与限制...
  7. 将24小时进制转化为12小时进制
  8. 中国医科大学2021年12月《医学心理学》作业考核试题
  9. 税收筹划工具篇---有限公司税收奖励返还,比例:60%-90%
  10. 【C++ 泛型编程 进阶篇】C++ 元模板推导函数调用的结果类型 std::result_of/std::invoke_result全面教程