:网络编程初识)
一、为什么需要网络编程本地资源VS网络资源当你在电脑上打开一个本地视频文件时播放器直接从硬盘读取数据并解码显示。这是本地IO数据来源于你的磁盘。当你通过浏览器打开b站看视频时视频文件不在你的电脑上而是存储在某台远程服务器上。你的浏览器通过网络将数据一点一点“下载”到本地再边下边播。网络编程的作用就是让你的程序能从网络上获取数据或者把数据提供给网络上的其他程序。二、网络编程的基本概念2.1发送端和接收端在一次网络数据传输中发送端数据的发送方进程源主机接收端数据的接收方进程目的主机。这两个概念是相对的。2.2请求和响应在典型的客户端--服务器端模型中一次完整的数据交互包含两次传输1.请求客户端向服务器端发送数据表明“我想要什么”2.响应服务器端处理完请求后向客户端返回结果数据。2.3通信流程1.客户端构建请求数据发送给服务器端2.服务器端接收请求解析并执行相应业务3.服务器端将处理结果封装为响应数据发送给客户端。4.客户端接收响应展示结果给用户三、Socket套接字——网络编程的基石3.1什么是ScoketSocket是操作系统提供的一组用于网络通信的编程接口。它封装了TCP/IP协议栈的细节让我们可以通过简单的函数调用来发送和接收数据。在Java中java.net包提供了Socket相关的类我们无需关心底层协议实现直接使用即可。3.2按传输层协议分类Socket主要分为三大类后续重点介绍前两种1.数据报套接字Datagram Socket——基于UDPUDP用户数据报协议是无连接、不可靠的传输层协议。特点无连接发送数据前不需要建立连接直接发送。不可靠传输数据可能丢失、重复、乱序且没有重传机制。面向数据报每次发送和接收都必须以完整的报文为单位。一次发送100字节接收端必须一次读满100字节不能分多次读。有接收缓冲区无发送缓冲区直接发送。大小受限单个数据报最大为64KB2.流套接字Steam Socket——基于TCPTCP传输控制协议是面向连接、可靠的传输层协议。特点有连接通信前必须建立连接三次握手通信结束后释放连接四次挥手。可靠传输这是相对的可靠性不是绝对不丢包、绝对不重复而是通过一些规则让接收到的数据是无差错、不丢失、不重复、按序到达的。有发送缓冲区和接收缓冲区大小不限取决于内存3.原始套接字Raw Socket原始套接字允许用户直接操作IP层数据可以自定义传输层协议。通常用于开发网络工具或安全分析。四、开发中的注意事项4.1同一主机测试在开发阶段可以在同一台电脑上启动两个Java进程分别扮演客户端和服务端。此时IP地址使用回环地址127.0.0.1数据不会真正经过网卡而是由操作系统内部转发非常高效。4.2端口被占用问题每个端口同时只能被一个进程绑定。如果服务端尝试绑定一个已经被占用的端口会抛出BindException。输入命令netstat -ano |findstr 端口号 即可显示占用该端口的进程PID在任务管理器中可以根据PID找到对应进程。4.3应用层协议的设计TCP/UDP指负责传输字节但接收方如何理解这些字节这就需要通信双方约定应用层协议。例如我们约定请求格式为”命令参数“用换行符分隔响应格式为”状态码数据“用JSON或XML序列化。