C 语言网络编程 — Socket I/O 性能优化手段

目录

Socket I/O 处理流程

每次 Socket I/O 操作,大体上都需要经历 2 个阶段:

  1. 准备数据阶段:数据包到达 Kernel 并就绪,Application 可以开始数据拷贝。
  2. 拷贝数据阶段:Application 通过 SCI 将数据从 Kernel 拷贝到 Userspace(进程虚拟地址空间)中。

对于上述 I/O 流程,基于 BSD Socket API 可以实现以下几种 I/O 模式:

  1. 阻塞式 I/O(Blocking I/O)
  2. 非阻塞式 I/O(Non-Blocking I/O)
  3. I/O 多路复用(I/O Multiplexing)

从阻塞程度的角度出发,效率由低到高为:阻塞 IO > 非阻塞 IO > 多路复用 IO。

阻塞式 I/O(Blocking I/O)

阻塞:是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。

默认情况下的 Socket I/O 都是阻塞式 I/O。

请添加图片描述

如下图所示:

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当使用一个 while 循环来不断尝试连接,直到连接成功或达到最大重连尝试次数时,您可以在循环中使用一个计数器来跟踪重连尝试次数。以下是一个示例代码: ```java import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class ReconnectExample { private static final int MAX_RECONNECT_ATTEMPTS = 3; private static final int RECONNECT_DELAY = 5000; // 重连延迟时间(毫秒) public static void main(String[] args) { Connection connection = null; int reconnectCount = 0; while (reconnectCount < MAX_RECONNECT_ATTEMPTS) { try { // 创建连接工厂 ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 connection = factory.createConnection(); // 设置异常监听器 connection.setExceptionListener(new ExceptionListener() { public void onException(JMSException exception) { System.out.println("Connection exception: " + exception.getMessage()); } }); // 启动连接 connection.start(); // 连接成功,跳出循环 break; } catch (JMSException e) { System.out.println("Failed to connect. Retrying in " + RECONNECT_DELAY + " milliseconds..."); try { Thread.sleep(RECONNECT_DELAY); } catch (InterruptedException ex) { ex.printStackTrace(); } reconnectCount++; } } if (connection != null) { // 连接成功,执行后续操作 System.out.println("Connected successfully!"); // ... } else { // 达到最大重连尝试次数,连接失败 System.out.println("Failed to connect after " + MAX_RECONNECT_ATTEMPTS + " attempts."); } } } ``` 在上述代码中,使用一个 while 循环来尝试连接。当连接失败时,等待一段时间(RECONNECT_DELAY),然后递增计数器(reconnectCount),直到达到最大重连尝试次数(MAX_RECONNECT_ATTEMPTS)或连接成功。 需要注意的是,在每次连接失败后,使用 `Thread.sleep(RECONNECT_DELAY)` 来添加延迟等待时间,以避免频繁地尝试连接对 ActiveMQ 服务器造成过大的压力。 在连接成功后,您可以执行后续操作,如发送消息或接收消息。如果达到最大重连尝试次数但仍无法连接成功,则可以根据实际需求进行错误处理或记录日志。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范桂飓

文章对您有帮助就请一键三连:)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值