【JavaEE初阶】第六节.网络编程基础

作者简介:大家好,我是未央;

博客首页:未央.303

系列专栏:JavaEE初阶

每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!

文章目录

前言

一、什么是网络编程

二、网络编程中的基本概念

   2.1发送端和接收端

2.2客户端和服务端

1.客户端获取服务端的资源;

2.客户端保存资源在服务端  ;

2.3请求和响应

2.4客户端和服务器之间的交互方式;

三、网络编程API

3.1 Java socket API

3.2 Socket套接字

3.2 简单介绍TCP和UDP协议

3.3 Socket编程注意事项

四、UDP数据报套接字编程

4.1 DatagramSocket API

4.2 DatagramPacket API

4.3 InetSocketAddress API

4.4 写一个UDP版本的回显服务器-客户端.(echo server)

4.5 客户端和服务器的工作流程

总结


前言

今天我们将学习有关网络编程的内容,学习有关网络编程客户端和服务器,以及网络编程API;

UDP数据报套接字编程等有关内容,要熟练掌握;


一、什么是网络编程

1)概念:

网络编程:网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输

【JavaEE初阶】第六节.网络编程基础_第1张图片

进程具有隔离性(每个进程有自己独立的虚拟地址空间);

进程间通信.借助一个每个进程都能访问到的公共区域,完成数据交换;

网络编程,也就是一种进程间通信的方式借助的公共区域就是网卡(当下最主流的方式)              

2)作用:

1.既能够让同一个主机的多个进程间通信;

所以即便是同一个主机,只要是不同进程,基于网络来传输数据, 也属于网络编程。

2.也可以让不同主机的多个进程间通信; 


二、网络编程中的基本概念

2.1发送端和接收端

1)定义:

在一次网络数据传输时:
发送端数据的发送方进程,称为发送端发送端主机网络通信中的源主机。
接收端数据的接收方进程,称为接收端接收端主机网络通信中的目的主机。
收发端 发送端和接收端两端,也简称为收发端。
注意:发送端和接收端只是相对的,只是一次网络数据传输产生数据流向后的概念。 【JavaEE初阶】第六节.网络编程基础_第2张图片

2.2客户端和服务端

1)概念:

1.客户端:主动发送网络数据的一方;

2.服务器:被动接受网络数据的一方;

服务器: 因此就只能长时间运行,甚至7*24小时运行!!

1.客户端获取服务端的资源;

【JavaEE初阶】第六节.网络编程基础_第3张图片

2.客户端保存资源在服务端  ;

【JavaEE初阶】第六节.网络编程基础_第4张图片

 举例说明:

好比在银行办事:
1.银行提供取款服务:用户(客户端)获取服务端资源(银行替用户保管的现金);
2.银行提供存款服务:用户(客户端)保存资源(现金)在银行(服务端);

2.3请求和响应

1)概念:

请求:客户端给服务器发送的数据;

响应:服务器给客户端返回的数据;

2)  举例说明:

一般来说,获取一个网络资源,涉及到两次网络数据传输:
第一次:请求数据的发送
第二次:响应数据的发送。
【JavaEE初阶】第六节.网络编程基础_第5张图片
实例分析:
好比在快餐店点一份炒饭;
先要发起请求:点一份炒饭,再有快餐店提供的对应响应:提供一份炒饭;

2.4客户端和服务器之间的交互方式;

1)一问一答:

客户端给服务器发一个请求;

服务器给客户端返回一个响应;

eg:[最常见的方式,比如,浏览网页]

2) 多问一答:

客户端发多个请求;

客户端返回多个响应;

eg:[更少见一些,比如上传文件]

3)  一问多答:

客户端发一个请求;

服务器返回多个响应;

eg:[还行,比如下载文件]

4)多问多答:

客户端发送多个请求;

服务器返回多个响应;

eg:[远程控制,游戏串流....]


三、网络编程API

3.1 Java socket API

进行网络编程,需要使用操作系统提供的网络编程API;

网络编程示意图:

【JavaEE初阶】第六节.网络编程基础_第6张图片

 正是这个传输层,提供了"网络通信api";这些api 也叫做socket api;

说明:

操作系统提供的原生api,是C语言的;

windows/linux/mac操作系统都是C/C++来写的~变;

成了Java中的面向对象风格的api ;变成了Java中的面向对象风格的api ;

传输层提供了两个非常重要的协议,截然不同!!

TCP和UDP协议;这两个协议对应的socket api也是截然不同的!!!


3.2 Socket套接字

1)概念:

Socket套接字,是由系统提供用于网络通信的技术;
是基于TCP/IP协议的网络通信的基本操作单元。 于Socket套接字的网络程序开发就是网络编程;

2)  分类:

Socket套接字主要针对传输层协议划分为如下三类:
流套接字:使用传输层TCP协议;
数据报套接字 使用传输层UDP协议 ;
原始套接字:
原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。
我们不学习原始套接字,简单了解即可。

3.2 简单介绍TCP和UDP协议

1.TCP协议;

1)概念:

TCP,即Transmission Control Protocol(传输控制协议),传输层协议。

2)特点:

有连接;
可靠传输;
面向字节流;
有接收缓冲区,也有发送缓冲区;
大小不限;
对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情
况下,是无边界的数据,可以多次发送,也可以分开多次接收。

2.UDP协议;

1)概念:

UDP,即User Datagram Protocol(用户数据报协议),传输层协议。
2)特点:
无连接;
不可靠传输;
面向数据报;
有接收缓冲区,无发送缓冲区;
大小受限:一次最多传输64k;
对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一
次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节;

总结:TCP和UDP协议的区别;(重点)

TCP:有连接,可靠传输,面向字节流,全双工;

UDP:无连接,不可靠传输,面向数据报,全双工;

举例解析特点含义:

1.有无连接:

有连接:打电话.先建立连接,然后再通信;

无连接:发微信.不必建立连接,直接通信即可;

2.是否可靠:

可靠传输:数据对方收没收到,发送方,能够有感知;打电话,就是可靠传输;

不可靠传输:数据对方收没收到,也不管,不知道;发微信,也就是不可靠传输;

网络通信,是无法保证100%到达的(网线被挖掘机铲断..)

3.面向字节流和面向数据报

面向字节流:

可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情
况下,是无边界的数据,可以多次发送,也可以分开多次接收。
面向数据报:
以数据报为传输的基本单位.
可以简单的理解为, 传输数据是一块一块的,发送一块数据假如100个字节,必须一
次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节;
4.全双工和半双工:
全双工 : 双向通信,一个管道,能A->B,B->A同时进行;
半双工 : 单向通信,一个管道,同一时刻,要么A->B,要么B->A,不能同时进行;

3.3 Socket编程注意事项

1. 客户端和服务端:开发时,经常是基于一个主机开启两个进程作为客户端和服务端,但真实的场 景,一般都是不同主机。
2. 注意目的IP和目的端口号,标识了一次数据传输时要发送数据的终点主机和进程
3. Socket编程我们是使用流套接字和数据报套接字,基于传输层的TCPUDP协议,但应用层协议,
也需要考虑,这块我们在后续来说明如何设计应用层协议。
4. 关于端口被占用的问题

四、UDP数据报套接字编程

4.1 DatagramSocket API

1)概念:

UDP的Socket APl核心类;

DatagramSocket 是UDP Socket 用于发送和接收UDP数据报。

DatagramSocket socket类,本质上相当于是一个"文件”.

在系统中,还有一种特殊的socket文件.对应到网卡设备;

2) DatagramSocket 构造方法:

【JavaEE初阶】第六节.网络编程基础_第7张图片

3) DatagramSocket 方法:

【JavaEE初阶】第六节.网络编程基础_第8张图片


4.2 DatagramPacket API

1)概念:

DatagramPacket是UDP Socket发送和接收的数据报。
UDP是面向数据报的协议;
传输数据,就是以DatagramPacket为基本单位;
2) DatagramPacket 构造方法:
【JavaEE初阶】第六节.网络编程基础_第9张图片
3) DatagramPacket 方法:
【JavaEE初阶】第六节.网络编程基础_第10张图片

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创 建。

4.3 InetSocketAddress API

1)作用:

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创 建。

2)InetSocketAddress ( SocketAddress 的子类 )构造方法:


4.4 写一个UDP版本的回显服务器-客户端.(echo server)

作用:客户端发啥,服务器就返回啥;

(不涉及到任何的业务逻辑,而只是单纯的演示 api的用法;)

一个操作系统上面,有很多端口号,0-65535 ;

程序如果需要进行网络通信,就需要获取到一个端口号.端口号相当于用来在网络上区分进程的身份标识符;

(操作系统收到网卡的数据,就可以根据网络数据报中的端口号,来确定要把这个数据交给哪个进程)

分配端口号的过程:

1.程序猿手动指定;new Datagramsocket(port);

2.系统自动分配;new DatagramSocket();(系统会自动分配一个空闲的端口)

一个端口,在通常情况下,是不能被同一个主机上的多个进程同时绑定的;

但是一个进程是可以绑定多个端口的;

但是如果端口已经被别人占用,再尝试绑定,此时就会抛出这个异常!!

throws SocketException;

1.读取客户端发来的请求

注意:读取客户端发来的请求,尝试读取.不是说调用了就一定能读到!!

如果客户端没有发来请求, receive就会阻塞等待;直到真的有客户端的请求过来了,receive才会返回;

【JavaEE初阶】第六节.网络编程基础_第11张图片

【JavaEE初阶】第六节.网络编程基础_第12张图片

【JavaEE初阶】第六节.网络编程基础_第13张图片


4.5 客户端和服务器的工作流程

客户端:

客户端,端口一般是自动分配的;

客户端程序是安装在用户的电脑上的,用户电脑当前运行哪些程序,是不可控的;如果要是手动指定端口说好这个端口就和其他程序冲突了,导致咱们的代码无法运行了;

服务器:

服务器,端口一般是手动指定的;

如果自动分配,客户端就不知道服务器的端口是啥了!!因此,服务器有固定的端口客户端才好访问;

工作流程(用上面4.4代码举例说明)

先是客户端进行操作:

1.根据用户输入,构造请求.

【JavaEE初阶】第六节.网络编程基础_第14张图片2.把请求发送给服务器

然后接下来就该服务器进行操作:

3.读取客户端发来的请求并且进行解析;

 4.然后根据请求计算响应;(服务器的核心逻辑)

 5.构造响应数据并且返回给客户端;

【JavaEE初阶】第六节.网络编程基础_第15张图片

此时又该客户端进行操作了:

6.读取服务器返回的响应;

7.解析响应并且显示给用户;

说明:

上述流程,不仅仅是回显服务器客户端是如此,大部分的客户端服务器都是如此!!相当于一个模板;

这是一套基本套路!!

咱们学习网络编程:

1.学网络编程的基本套路(核心流程)

2.学习socket api的使用;

注意:一个服务器,是可以同时给多个客户端提供服务的!!

【JavaEE初阶】第六节.网络编程基础_第16张图片

总结

今天的内容就介绍到这里,我们下期再见!!!!!

【JavaEE初阶】第六节.网络编程基础_第17张图片

你可能感兴趣的:(JavaEE初阶,java-ee,java,网络编程)