一、网络编程基础知识
(1). 网络通讯的三要素
[1]. 网络通讯的三要素:IP地址、端口号和传输协议
[2]. 数据通讯的原理
数据通讯的原理就是数据传输
(2). IP地址
[1]. IP地址基本含义
IP地址定义:网络中设备的标识
[2]. 主机名和IP地址的关系
主机名:单纯的IP地址不容易记忆,可用主机名替代
e.g. 本机回环地址:127.0.0.1 对应的主机名:localhost (默认)
[3]. 特殊IP:127.0.0.1简介
{1}. 如果本机上没有配置任何IP地址的情况下,本机默认的IP地址为127.0.0.1
{2}. 127.0.0.1地址的用处之一:检验本机网卡是否运行正常
在cmd中输入ping 127.0.0.1之后,如果出现下面的场面,表明本机的网卡运行正常。
(3). 端口号
[1]. 端口/进程的逻辑地址(port)
端口定义:用于标识进程的数字称为进程的逻辑地址,简称为端口号
[2]. 端口的有效范围:0~65535 (2个Byte的长度)
【注意】其中0~1024是系统保留端口号
[3]. 常用的端口号
{1}. Web服务器端口:80 (位于0~1024之间)
{2}. Tomcat服务器端口:8080
{3}. MySQL数据库端口:3306
[4]. 一个网络应用程序可以对应一个或者多个端口号
从主机1向外发送数据
[1]. 向外发送数据的过程就是将原始数据根据每层具有的特点和协议对数据进行层层封装。
[2]. 数据在传输层的封装
{1}. 当向下进行到传输层的时候,要根据传输层的特点和协议对从会话层传来的数据进行封装
{2}. 传输层的协议是TCP和UDP
{3}. 数据在传输层被加上TCP/UDP的层次信息
[3]. 数据在网络层的封装
{1}. 网络层的协议是IP地址协议
{2}. 数据从传输层进行到网络层的时候,数据被加上一个目标IP地址,用于告知数据运输的终点。
[4]. 物理层简介
{1}. 物理层是看得见摸得着的媒质。
{2}. 物理层的典型设备是网线、光纤、红外或者蓝牙
{3}. 两台主机之间通过网线相连
{4}. 数据传输到物理层的时候,已经被封装成数据包。此时物理层将数据传输出去。
{5}. 数据包通过连接在两台主机之间的物理层介质,从一台主机传向另一台主机
主机2接收数据
[1]. 从外接收数据的过程将数据包根据每层具有的特点和协议对数据包进行层层拆封。
[2]. 数据在应用层的拆封以及数据的最终去向
{1}.首先应用层将数据包拆开,获得原始数据和其他的相关信息 (包含该数据应该发送到本台主机的那一个具体端口)
{2}. 根据端口号将原始数据发送到本机指定的端口对应的应用程序上。
数据的封包和数据的拆包:
[1]. 从应用层到物理层对数据的向下传输过程中,是对数据的封包
[2]. 从物理层到应用层对数据的向上传输过程中,是对数据的拆包
(3)TCP/IP参考模型
TCP/IP参考模型和OSI参考模型的关系:
TCP/IP模型是对OSI参考模型的简化,进行了两次合并:
第一次:将OSI的应用层、表示层和会话层合并成TCP/IP的应用层
第二次:将OSI的数据链路层和物理层合并成TCP/IP的主机至网络层
TCP/IP模型的由来:
两次合并之后,凸显了OSI的传输层和网络层,其余的层全部进行了整合。这样分别就凸显了传输层和网络层的协议:TCP/UDP协议和IP地址协议。这样OSI简化后四层模型就称为TCP/IP参考模型。
(2). 两台主机通过OSI模型通讯过程的简述
二、UDP传输
1、UDP相关的类
UDP协议是面相无连接的协议并且数据的传输形式数据报包。
与UDP传输协议本身相关------DatagramSocket类。
2、UDP发送端和接收端
发送端
步骤:
(1)建立DatagramSocket服务,即建立发送断点;
(2)提供数据,并将数据封装到字节数组中;
(3)创建DatagramPacket数据包,并把数据封装到包中,同时指定IP和接收端口;
(4)通过Socket服务,利用send方法将数据包发送出去;
(5)关闭DatagramSocket和DatagramPacket服务。
接收端
步骤:
(1)建立DatagramSocket服务,并监听一个端口;
(2)定义一个字节数组和一个数据包,同时将数组封装进数据包中;
(3)通过DatagramPacket的receive方法,将接收的数据存入定义好的数据包中;
(4)通过DatagramPacket关闭的方法,获取发送数据包中的信息;
(5)关闭DatagramSocket和DatagramPacket服务;
【注意】
1、发送端与接收端是两个独立的运行程序。
2、在发送端,要在数据包对象中明确目的地IP及端口。
3、在接收端,要指定监听的端口。
3、发送端和接收端启动顺序
(1). 错误的启动顺序
[1].先启动发送端,再启动接收端
[2]. 此时运行结果:
还没等接收端运行完,发送端已经运行完成。这样发送端发送的数据没有正确发送到接收端,数据丢失。
(2). 正确的启动顺序
分析:先启动接收端,再启动发送端的可行性
由于接收端的DatagramSocket端点中含有对DatagramSocket的receive方法调用,这个方法是阻塞式的方法。
{1}. 由于接收端的程序先运行,所以开始接收端没有数据报包。因此接收端的程序运行到receive方法之后,就阻塞停在那里,等待有数
据报包发送过来。
{2}. 此时再启动发送端的程序,发送端会发送数据报包。这时候接收端就会接到这个数据报包。这样发送端的程序可以正确执行完成,并且发
送的数据被接收端正确接收。因此这种方式的启动顺序是可行的。
(3). 运行结果
[1]. 先启动接收端的Socket服务,程序运行到receive方法之后,阻塞停下来等待有数据报包发送过来。
[2]. 再启动发送端的Socket服务,程序一下运行完成,同时接收端接收到发送端发送来的数据。
三、TCP传输
1、通过Socket建立客户端
建立连接之后,通过Socket中的IO流进行数据的传输;传输完成之后关闭socket;
客户端与服务器端是两个独立的应用程序。
3、TCP客户端和服务端创建
客户端:
步骤:
(1)建立Socket服务,并指定要连接的主机和端口;
(2)获取Socket流中的输出流OutputStream,将数据写入流中,通过网络发送给服务端;
(3)获取Socket流中的输出流InputStream,获取服务端的反馈信息;
(4)关闭资源。
服务端:
步骤:
(1)建立ServerSocket服务,并监听一个端口;
(2)通过ServerSocket服务的accept方法,获取Socket服务对象;
(3)使用客户端对象的读取流获取客户端发送过来的数据;
(4)通过客户端对象的写入流反馈信息给客户端;
(5)关闭资源。
4、客户端和服务端启动顺序
(1). 错误的启动顺序
[1]. 由于TCP传输协议是面向连接的。所以不能随意启动某个Socket通信端。
[2]. 先启动客户端Socket再启动服务端ServerSocket ------错误的启动顺序
此时客户端就会立刻去连接服务端。但是由于服务端的Socket没有被启动,所以面相连接的TCP数据传输通道就不能形成。此时会抛出java.net.ConnectionException异常,TCP数据传输失败。
(2). 正确的启动顺序
[1]. 先启动服务端ServerSocket再启动客户端Socket ------正确的启动顺序
【可行性分析】服务端的程序运行到accept()方法之后,没有发现有connection接入。此时服务端的程序被阻塞,暂停在那里等待。之后,客户端程序被启动并立刻去连接目标服务端。这时候发现服务端已经启动,就会建立传输通道。这时候,客户端和服务端就可以进行通信了。因此这个启动顺序可行。
[2]. TCP启动顺序和UDP启动顺序对比
{1}. TCP的启动顺序务必是先启动服务端,再启动客户端。否则,程序直接抛出异常
{2}. UDP的启动顺序是先启动接收端再启动客户端。但是不这么做,接收端无法接收到数据,但是程序不会发生异常。