通信过程:
1. 找到对方IP
2. 数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序用数字进行标识。为了方便称呼这些数字,将其叫做端口,逻辑端口。
3. 定义通信规则。即协议,国际组织定义了通讯协议TCP/IP。
TCP/IP简介
TCP/IP 指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol)。
TCP/IP中的通信协议:
l TCP (传输控制协议) - 应用程序之间通信
l UDP (用户数据包协议) - 应用程序之间的简单通信
l IP (网际协议) - 计算机之间的通信
l ICMP (因特网消息控制协议) - 针对错误和状态
l DHCP (动态主机配置协议) - 针对动态寻址
TCP/IP 寻址
IP 地址
IP 地址:220.165.239.44。TCP/IP 使用 4 个数字来为计算机编址。每个计算机必须有一个唯一的 4 个数字的地址。
域名
12 个阿拉伯数字很难记忆。使用一个名称更容易。对此就将 TCP/IP 地址进行命名,eg:w3school.com.cn 就是一个域名。
当你键入一个像 http://www.w3school.com.cn 这样的域名,域名会被一种 DNS 程序翻译为数字。在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。
网络模型
OSI参考模型 | TCP/IP模型 | Eg:QQ传输 |
应用层 | 应用层 | 将数据进行对应层的特征进行打包 |
表示层 | ||
会话层 | ||
传输层 | 传输层 | UDP/TCP协议信息 |
网络层 | 网际层 | 给定数据IP地址 |
数据链路层 | 主机至网络层 |
|
物理层 | 网线、端口、网卡 |
通讯三要素:
1. IP地址:网络中设备的标识,本地回环地址:127.0.0.1,主机名:localhost;
2. 端口号:用于标记过程的逻辑地址,不用进程的标识。有效端口:0~65535,其中0~1024为系统使用或者保留的端口。
3. 传输协议
传输协议:
UDP:
1. 将数据及源和目的地址封装在数据包中,不需要建立连接。(这里需要明确目的地址,面向的为无连接)
2. 每个数据包大小在60K内。(将大数据封装成小数据,会自动分包,每包<60k)
3. 因为为无连接,因此是不可靠协议。
4. 不需要建立连接,因此速度很快
Eg:视频会议,桌面共享(类似对讲机)
TCP
1. 建立连接,形成传输数据的通道
2. 在连接中进行大数据量传输
3. 通过三次握手完成连接,是可靠协议
4. 必须建立连接,因此效率低
EG:打电话,下载
Socket:
为网络服务提供一种机制。(类似于客户端的数据港口)
通信两端都有Socket,网络通信就是Socket间的通信,数据再两个Socket之间进行传输。
UDP的Socket服务
发送步骤:
1. 建立UDP Socket服务(断点):创建DatagramSocket;
2. 提供数据,并将数据封装至包中:创建DatagramPacket
3. 通过Socket发送功能发送:通过DatagramSocket进行发送
4. 关闭资源:关闭DatagramSocket
接收步骤
1. 建立UDP Socket服务,坚守某个端点:创建DatagramSocket
2. 定义一个数据包,因为要存储接收到的字节流:创建DatagramPacket
3. 通过Socket服务的receive方法将数据存入定义好的数据包中(阻塞式方法,通过DatagramSocket进行接收)
4. 通过数据包对象的特有功能,将这些数据取出;通过DatagramPacket取出。
5. 关闭资源。
INetAdderss类:
IP地址类,使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。
构造方法:
常用方法:
static InetAddress | getLocalHost() |
getHostName() | |
toString() | |
byte[] | getAddress() |
static InetAddress |
获取指定主机的IP对象。
static InetAddress | getByAddress(byte[] addr) |
static InetAddress[] | getAllByName(String host) |
DatagramSocket类:
用来发送和接收数据报包的套接字。
构造方法:
DatagramSocket(int port,
InetAddress laddr)
创建数据报套接字,将其绑定到指定的本地地址。
常用方法
void | receive(DatagramPacket p) |
void | send(DatagramPacket p) |
DatagramPacket类:
用来实现无连接包投递服务。可以利用其中的方法得到关于数据的信息。
构造函数:
DatagramPacket(byte[] buf, int length) |
DatagramPacket(byte[] buf, int length,InetAddress address, int port) |
DatagramPacket(byte[] buf, int offset, int length) |
常用方法
void | setAddress(InetAddress iaddr) |
byte[] | getData() |
int | getLength() |
int | getPort() |
Tcp传输
客户端建立
创建客户端Socket服务,指定要连接的主机和端口:Socket
服务端建立
1. 建立服务端的Socket服务,ServerSocket
2. 获取连接过来的客户端对象,通过SercerSocket的accept完成(阻塞式的)
3. 客户端若发送数据,服务端要使用对应的客户端对象,并获取该客户端对象的读取流。
4. 关闭服务端和客户端(防止客户端占用资源)
客户端响应
1. 获取Socket中的输入流,收取服务端的反馈数据。
2. 关闭服务端资源
注意:服务端和客户端都是用的是阻塞式方法,这些方法在没有读到结束标记就一致等,而导致两端都在等待。
Socket类:
构造函数
Socket(InetAddress address,int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
其他方法:
getInputStream | |
getOutputStream | |
| getPort |
getLocalAddress | |
getInetAddress |
ServerSocket类:
构造方法:
ServerSocket(int port)
创建绑定到特定端口的服务器套接字。
ServerSocket(int port, int backlog)
利用指定的 backlog创建服务器套接字并将其绑定到指定的本地端口号。这里表明最大的连接数。
其他方法
accept | |
| close |
| isClosed |
| shutdownInput |
| shutdownOutput |
TCP ”VS” UDP
1. UDP分为发送数据端(DatagramSocket)和接受数据段(DatagramPacket),Tcp分为客户端(Socket)和服务端(ServerSocket)。
2. TCP的客户端的Socket对象在建立时,就连接指定的主机,因此在建立服务时就需要有服务端存在,并连接成功。再改通道进行传输。
客户端对服务器的请求命令行:
53行:我们所遵循的规则;
54行:我们所能支持的数据格式
57行:语言
58行:数据压缩方式
61行:主机位置
为了将这些数据进行提取,我们使用URL类对象进行数据的提取。
网络知识:
输入网址之后内部工作原理:
1. 进行域名解析,将网址进行解析。(访问公网上的域名解析服务器)
2. 找到主机与IP地址的映射关系:获取DNS。(获取对应主机的地址IP)
3. 客户机获取DNS并向DNS服务器再次发起请求。(正式访问服务器)
练习
UDP接收:
UDP客户端互相发送数据
TCP客户端与服务端通信
TCP服务端转大写返回给客户端
注意这里的阻塞式方法,bufIn.readLine()需要收到换行符之后才会认为读取完毕。我们可以用PrintWriter类来替代。从而免除刷新和换行。
TCP服务端多客户端登陆:
为了能让服务端能处理多个客户,就需要将每个客户封装到一个单独的线程中。
URL类:
构造函数:
URL(
String spec)
根据 String
表示形式创建 URL
对象。
其他方法:
getHost | |
getProtocol | |
| getPort |
getPath | |
getFile | |
getQuery |
Query得到的是特殊信息。
openConnection |
直接用URL对象进行连接,省去了Socket连接这一步。在获得URLConnection对象之后可以直接用其方法:(URL为应用层对象)
getInputStream | |
getOutputStream |
获取数据。