27.Java学习笔记第二十七节——IO 流与网络编程(尚硅谷视频整理)


一、网络编程概述

1、背景知识

(1)Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。

(2)Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。

2、网络基础

(1)计算机网络:

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

(2)网络编程的目的:

直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。

(3)网络编程中有两个主要的问题:

① 如何准确地定位网络上一台或多台主机;定位主机上的特定的应用。
→ IP:区分主机。
→ 端口号:区分一个主机上不同的应用程序。

② 找到主机后如何可靠高效地进行数据传输。
一定的规则(即网络通信协议,有两套参考模型):
→ OSI参考模型:模型过于理想化,未能在因特网上广泛推广。
→ TCP/IP参考模型:事实上的国际标准。

协议很复杂,所以分层处理:
在这里插入图片描述

二、通信要素

1、通信要素一:IP和端口号

(1)IP地址

1.唯一的标识 Internet 上的计算机(通信实体),在Java中用InetAddress类来表示。

InetAddress inet1=InetAddress.getByName("192.168.10.14");

2.分类①:IPV4 和 IPV6

  • IPV4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。以点分十进制表示,如192.168.0.1
  • IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示,数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984

3.分类 ②:公网地址(万维网使用)和私有地址(局域网使用)。

  • 192.168.开头的就是私有地址,范围即为192.168.0.0–192.168.255.255,专门为组织机构内部使用。

4.域名:如 www.baidu.com,www.sina.com等。域名容易记忆,当在连接网络时输入一个主机的域名后,域名解析服务器(DNS)负责将域名转化成IP地址,再访问网络服务器,这样才能和主机建立连接。

5.本地回环地址:127.0.0.1 ,对应:Localhost

InetAddress inet2=InetAddress.getLocalHost();

6.实例化 InetAddress 两个方法:getByName(String host)、getLocalHost()。两个常用方法:获取域名getHostName(),获取IP地址getHostAddress()

(2)端口号

1.用来标识正在计算机上运行的进程(程序);不同的进程有不同的端口号;被规定为一个 16 位的整数 0~65535。

2.分类:

  • 公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口80,FTP占用端口21,Telnet占用端口23)
  • 注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。
  • 动态/私有端口:49152~65535。

3.端口号与IP地址的组合得出一个网络套接字:Socket。网络通信通常也称为Socket通信。

2、通信要素二:网络协议

(1)定义

1.计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。

2.计算机网络通信涉及内容很多,比如指定源地址和目标地址,加密解密,压缩解压缩,差错控制,流量控制,路由控制,如何实现如此复杂的网络协议呢?

3.在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。

(2)传输层两个重要协议TCP和UDP

传输层协议中有两个非常重要的协议:

  • 传输控制协议TCP(Transmission Control Protocol)
  • 用户数据报协议UDP(User Datagram Protocol)。
1、TCP/IP(传输层/网络层)协议簇
  • TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
  • IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
  • TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。
2、TCP

(1)内容

  • 使用TCP协议前,须先建立TCP连接,形成传输数据通道。
  • 传输前,采用“三次握手”方式,点对点通信,是可靠的。
  • TCP协议进行通信的两个应用进程:客户端、服务端。
  • 在连接中可进行大数据量的传输。
  • 传输完毕,需释放已建立的连接,效率低。

(2)“三次握手”

在这里插入图片描述

“三次握手”即建立TCP连接。

形象理解:
A:你在吗,我是A
B:我在呢,我是B
A:你在就行跟你说个事,我是A

(3)“四次挥手”

在这里插入图片描述

“四次挥手”即终止TCP连接。

形象理解:像结婚要双方同意才可以。A向B请求断开连接,B反馈。B再向A请求断开连接,A再反馈。两方都断开才是真正的断开。

3、UDP

(1)内容

  • 将数据、源、目的封装成数据包,不需要建立连接。
  • 每个数据报的大小限制在64K内 。
  • 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的。
  • 可以广播发送。
  • 发送数据结束时无需释放资源,开销小,速度快。

(3)Socket

  • 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。
  • 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
  • 通信的两端都要有Socket,是两台机器间通信的端点。
  • 网络通信其实就是Socket间的通信。
  • Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
  • 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。
  • Socket分类:
    • 流套接字(stream socket):使用TCP提供可依赖的字节流服务。
    • 数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务。

三、TCP网络编程

基于Socket的TCP网络编程:

1、流程

(1)创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。

(2)打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输。

(3)按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。

(4)关闭 Socket:断开客户端到服务器的连接,释放线路 。

2、客户端与服务端

客户端:

  • 自定义
  • 浏览器

服务端:

  • 自定义
  • Tomcat服务器

3、举例

功能:客户端发送信息给服务端,服务端将信息显示在控制台上。

//客户端
@Test
public void client()
{
//1.创建Socket对象,指明服务器端的IP与端口号
	InetAddress inet =InetAddress.getByName("127.0.0.1);//服务端的IP地址
	Socket socket=new Socket(inet,8899);//端口号8899
	
//2.获取一个输出流,用于输出数据
	OutputStream os=socket.getOutputStream();
	
//3.写出数据
	os.write("你好,我是客户端");
	
//4.资源关闭
	os.close();
	socket.close();
}

//服务端
@Test
public void server()
{
//1.创建Socket对象,指明自己的端口号
	ServerSocket ss=new ServerSocket(8899);
//2.调用accept()表示接收来自于客户端的socket
	Socket socket=ss.acept();
//3.获取输入流
	InputStream is=socket.getInputStream();
	
//不建议这样写,一个中文3个字节,5太小,两个中文时,第二个字被分开存会出现乱码
	/*byte[] buffer=new byte[5];
	int len;
	while((len=is.read(buffer))!=-1)
	{
		String str=new String(buffer,0,len);
		System.out.print(str);
	}
	*/
//建议如下写:
//4.读取输入流中的数据
	ByteArrayOutputStream baos=new ByteArrayOutputStream();//这时写入的内容在ByteArrayOutputStream的数组里,不会每5个就还原,而是等所有的输完后整体转换,所以不会出现乱码。
	byte[] buffer=new byte[5];
	int len;
	while((len=is.read(buffer))!=-1)
	{
		baos.write(buffer,0,len);
	}
	System.out.print(baos.toString());
	
//5.资源关闭
	baos.close();
	is.close();
	socket.close();
	ss.close();
}

以上代码省略了异常处理过程。

四、UDP网络编程

1、内容

(1)类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。

(2)UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

(3)DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。

(4)UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。如同发快递包裹一样。

2、流程

  1. DatagramSocket与DatagramPacket
  2. 建立发送端,接收端
  3. 建立数据包
  4. 调用Socket的发送、接收方法
  5. 关闭Socket

发送端与接收端是两个独立的运行程序

五、URL编程

1、内容

(1)URL(Uniform Resource Locator):统一资源定位符(),它表示 Internet 上某一资源的地址。种子就是一种URL。

(2)它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

(3)通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。

(4)URL的基本结构由5部分组成: <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表

例如: http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123

  • #片段名:即锚点,例如看小说,直接定位到章节
  • 参数列表格式:参数名=参数值&参数名=参数值…
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值