网络编程是指利用计算机网络进行数据交换和通信的编程技术,使得不同计算机或设备之间能通过网络进行信息传输
基础概念
首先了解一下网络编程的基础概念
客户端和服务器
- 客户端是指发起请求的一方,一般是属于用户端的设备,例如浏览器、手机应用
- 服务器是接收并处理请求的一方,负责提供服务或资源,例如web服务器、数据库等
套接字 socket
套接字是网络编程中的核心,提供了一个通信端点,客户端和服务器通过套接字进行数据的传输
套接字的主要作用是实现对网络通信的封装,包括数据的发送和接收
协议
协议是指一套规则和约定,用来规范网络中通信双方如何交换数据。协议定义了数据的格式、传输的顺序、错误处理机制、重传机制等。
常见通信协议有 TCP/IP、UDP
TCP(传输控制协议):面向连接,可靠,保证数据的顺序和完整性。适用于要求数据传输准确、稳定的应用。
UDP(用户数据报协议):无连接,不可靠,传输速度快,适用于实时应用,如视频、语音通话等。
网络编程的主要步骤
- 创建套接字
- 在服务器端绑定地址
- 在服务器端监听和接受连接
- 客户端连接到服务端
- 数据传输
- 关闭连接
网络演变的本质
随着网络连接上升,为了解决连接的问题而产生的变化
阻塞IO
即BIO
在输入/输出操作时,程序会被阻塞,直到操作完成,在阻塞IO模式下,当程序请求读取或写入数据时,程序会暂停执行,等待操作完成后才会继续执行
优点很明显,可以简单实现client和server端的通信 通常一个client连接分配一个线程进行处理
但缺点是 能支持的并发client连接数较少,一台server能分配的线程是有限的,大量线程会造成上下文切换过多而影响性能
为了解决以上问题,避免阻塞影响后续接收新的client连接,需将阻塞逻辑交由单独线程进行处理
非阻塞IO
NIO
在进行 I/O 操作时,程序不会因等待数据的传输阻塞,操作会立即返回,程序可以继续执行其他任务,直到有数据可以读取或写入时再进行操作
相比于阻塞 I/O,非阻塞 I/O 可以显著提高程序的响应性和并发性
优点是比较明显的,服务器在读取时数据未就绪就直接返回,无需阻塞,可以通过一个线程来管理多个client连接
而缺点是 由于系统并不知道数据何时准备就绪,需要不断的进行轮询,涉及很多无效的、频繁的系统调用
而对非阻塞IO轮询可以如何改进呢?将会在后续进行补充