网络编程是指利用计算机网络进行数据交换和通信的编程技术,使得不同计算机或设备之间能通过网络进行信息传输

基础概念

首先了解一下网络编程的基础概念

客户端和服务器

  • 客户端是指发起请求的一方,一般是属于用户端的设备,例如浏览器、手机应用
  • 服务器是接收并处理请求的一方,负责提供服务或资源,例如web服务器、数据库等

套接字 socket

套接字是网络编程中的核心,提供了一个通信端点,客户端和服务器通过套接字进行数据的传输

套接字的主要作用是实现对网络通信的封装,包括数据的发送和接收

协议

协议是指一套规则和约定,用来规范网络中通信双方如何交换数据。协议定义了数据的格式、传输的顺序、错误处理机制、重传机制等。

常见通信协议有 TCP/IP、UDP

  • TCP(传输控制协议):面向连接,可靠,保证数据的顺序和完整性。适用于要求数据传输准确、稳定的应用。

  • UDP(用户数据报协议):无连接,不可靠,传输速度快,适用于实时应用,如视频、语音通话等。

网络编程的主要步骤

  1. 创建套接字
  2. 在服务器端绑定地址
  3. 在服务器端监听和接受连接
  4. 客户端连接到服务端
  5. 数据传输
  6. 关闭连接

网络演变的本质

随着网络连接上升,为了解决连接的问题而产生的变化

阻塞IO

即BIO

在输入/输出操作时,程序会被阻塞,直到操作完成,在阻塞IO模式下,当程序请求读取或写入数据时,程序会暂停执行,等待操作完成后才会继续执行

优点很明显,可以简单实现client和server端的通信 通常一个client连接分配一个线程进行处理

但缺点是 能支持的并发client连接数较少,一台server能分配的线程是有限的,大量线程会造成上下文切换过多而影响性能


为了解决以上问题,避免阻塞影响后续接收新的client连接,需将阻塞逻辑交由单独线程进行处理

非阻塞IO

NIO

在进行 I/O 操作时,程序不会因等待数据的传输阻塞,操作会立即返回,程序可以继续执行其他任务,直到有数据可以读取或写入时再进行操作

相比于阻塞 I/O,非阻塞 I/O 可以显著提高程序的响应性和并发性

优点是比较明显的,服务器在读取时数据未就绪就直接返回,无需阻塞,可以通过一个线程来管理多个client连接

而缺点是 由于系统并不知道数据何时准备就绪,需要不断的进行轮询,涉及很多无效的、频繁的系统调用


而对非阻塞IO轮询可以如何改进呢?将会在后续进行补充