作者简介:大家好,我是未央;
博客首页:未央.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)概念:
网络编程:指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)
进程具有隔离性(每个进程有自己独立的虚拟地址空间);
进程间通信.借助一个每个进程都能访问到的公共区域,完成数据交换;
网络编程,也就是一种进程间通信的方式,借助的公共区域就是网卡(当下最主流的方式)
2)作用:
1.既能够让同一个主机的多个进程间通信;
所以即便是同一个主机,只要是不同进程,基于网络来传输数据, 也属于网络编程。2.也可以让不同主机的多个进程间通信;
1)定义:
在一次网络数据传输时:发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。收发端 :发送端和接收端两端,也简称为收发端。
注意:发送端和接收端只是相对的,只是一次网络数据传输产生数据流向后的概念。![]()
1)概念:
1.客户端:主动发送网络数据的一方;
2.服务器:被动接受网络数据的一方;
服务器: 因此就只能长时间运行,甚至7*24小时运行!!
1.客户端获取服务端的资源;
2.客户端保存资源在服务端 ;
举例说明:
好比在银行办事:1.银行提供取款服务:用户(客户端)获取服务端资源(银行替用户保管的现金);2.银行提供存款服务:用户(客户端)保存资源(现金)在银行(服务端);
1)概念:
请求:客户端给服务器发送的数据;
响应:服务器给客户端返回的数据;
2) 举例说明:
一般来说,获取一个网络资源,涉及到两次网络数据传输:第一次:请求数据的发送第二次:响应数据的发送。实例分析:好比在快餐店点一份炒饭;先要发起请求:点一份炒饭,再有快餐店提供的对应响应:提供一份炒饭;
1)一问一答:
客户端给服务器发一个请求;
服务器给客户端返回一个响应;
eg:[最常见的方式,比如,浏览网页]
2) 多问一答:
客户端发多个请求;
客户端返回多个响应;
eg:[更少见一些,比如上传文件]
3) 一问多答:
客户端发一个请求;
服务器返回多个响应;
eg:[还行,比如下载文件]
4)多问多答:
客户端发送多个请求;
服务器返回多个响应;
eg:[远程控制,游戏串流....]
进行网络编程,需要使用操作系统提供的网络编程API;
网络编程示意图:
正是这个传输层,提供了"网络通信api";这些api 也叫做socket api;
说明:
操作系统提供的原生api,是C语言的;
windows/linux/mac操作系统都是C/C++来写的~变;
成了Java中的面向对象风格的api ;变成了Java中的面向对象风格的api ;
传输层提供了两个非常重要的协议,截然不同!!
TCP和UDP协议;这两个协议对应的socket api也是截然不同的!!!
1)概念:
2) 分类:
1.TCP协议;
1)概念:
TCP,即Transmission Control Protocol(传输控制协议),传输层协议。
2)特点:
有连接;可靠传输;面向字节流;有接收缓冲区,也有发送缓冲区;大小不限;
2.UDP协议;
1)概念:
无连接;不可靠传输;面向数据报;有接收缓冲区,无发送缓冲区;大小受限:一次最多传输64k;
总结:TCP和UDP协议的区别;(重点)
TCP:有连接,可靠传输,面向字节流,全双工;
UDP:无连接,不可靠传输,面向数据报,全双工;
举例解析特点含义:
1.有无连接:
有连接:打电话.先建立连接,然后再通信;
无连接:发微信.不必建立连接,直接通信即可;
2.是否可靠:
可靠传输:数据对方收没收到,发送方,能够有感知;打电话,就是可靠传输;
不可靠传输:数据对方收没收到,也不管,不知道;发微信,也就是不可靠传输;
网络通信,是无法保证100%到达的(网线被挖掘机铲断..)
3.面向字节流和面向数据报
面向字节流:
可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。面向数据报:以数据报为传输的基本单位.可以简单的理解为, 传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节;4.全双工和半双工:全双工 : 双向通信,一个管道,能A->B,B->A同时进行;半双工 : 单向通信,一个管道,同一时刻,要么A->B,要么B->A,不能同时进行;
1. 客户端和服务端:开发时,经常是基于一个主机开启两个进程作为客户端和服务端,但真实的场 景,一般都是不同主机。2. 注意目的IP和目的端口号,标识了一次数据传输时要发送数据的终点主机和进程3. Socket编程我们是使用流套接字和数据报套接字,基于传输层的TCP或UDP协议,但应用层协议,也需要考虑,这块我们在后续来说明如何设计应用层协议。4. 关于端口被占用的问题
1)概念:
UDP的Socket APl核心类;
DatagramSocket 是UDP Socket , 用于发送和接收UDP数据报。DatagramSocket socket类,本质上相当于是一个"文件”.
在系统中,还有一种特殊的socket文件.对应到网卡设备;
2) DatagramSocket 构造方法:
3) DatagramSocket 方法:
1)概念:
DatagramPacket是UDP Socket发送和接收的数据报。UDP是面向数据报的协议;传输数据,就是以DatagramPacket为基本单位;
构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创 建。
1)作用:
2)InetSocketAddress ( SocketAddress 的子类 )构造方法:
作用:客户端发啥,服务器就返回啥;
(不涉及到任何的业务逻辑,而只是单纯的演示 api的用法;)
一个操作系统上面,有很多端口号,0-65535 ;
程序如果需要进行网络通信,就需要获取到一个端口号.端口号相当于用来在网络上区分进程的身份标识符;
(操作系统收到网卡的数据,就可以根据网络数据报中的端口号,来确定要把这个数据交给哪个进程)
分配端口号的过程:
1.程序猿手动指定;new Datagramsocket(port);
2.系统自动分配;new DatagramSocket();(系统会自动分配一个空闲的端口)
一个端口,在通常情况下,是不能被同一个主机上的多个进程同时绑定的;
但是一个进程是可以绑定多个端口的;
但是如果端口已经被别人占用,再尝试绑定,此时就会抛出这个异常!!
throws SocketException;
1.读取客户端发来的请求
注意:读取客户端发来的请求,尝试读取.不是说调用了就一定能读到!!
如果客户端没有发来请求, receive就会阻塞等待;直到真的有客户端的请求过来了,receive才会返回;
客户端:
客户端,端口一般是自动分配的;
客户端程序是安装在用户的电脑上的,用户电脑当前运行哪些程序,是不可控的;如果要是手动指定端口说好这个端口就和其他程序冲突了,导致咱们的代码无法运行了;
服务器:
服务器,端口一般是手动指定的;
如果自动分配,客户端就不知道服务器的端口是啥了!!因此,服务器有固定的端口客户端才好访问;
工作流程(用上面4.4代码举例说明)
先是客户端进行操作:
1.根据用户输入,构造请求.
然后接下来就该服务器进行操作:
3.读取客户端发来的请求并且进行解析;
4.然后根据请求计算响应;(服务器的核心逻辑)
5.构造响应数据并且返回给客户端;
此时又该客户端进行操作了:
6.读取服务器返回的响应;
7.解析响应并且显示给用户;
说明:
上述流程,不仅仅是回显服务器客户端是如此,大部分的客户端服务器都是如此!!相当于一个模板;
这是一套基本套路!!
咱们学习网络编程:
1.学网络编程的基本套路(核心流程)
2.学习socket api的使用;
注意:一个服务器,是可以同时给多个客户端提供服务的!!
今天的内容就介绍到这里,我们下期再见!!!!!