理解网络通信:短连接、长连接、短轮询和长轮询

序言

在 Web 开发中,我们经常听到关于网络通信的术语,比如短连接、长连接、短轮询和长轮询。这些术语代表了不同的通信模式,对于构建实时性应用程序非常重要。本文将深入探讨这些概念,帮助大家更好地理解它们。

一、短连接(Short Connection)

短连接是一种临时性连接,它在完成数据传输后立即关闭。在网络通信中,每次通信都需要重新建立连接和断开连接。比如,HTTP 请求-响应中的非持久连接就是一种短连接。虽然短连接简单易实现,但它对于频繁通信的实时应用来说效率较低。

客户端示例:

fetch('http://localhost:8080/short-connection', {
  method: 'POST',
  body: JSON.stringify({ message: 'Hello, server!' })
})
  .then(response => response.text())
  .then(data => {
    console.log('Response from server:', data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

服务端示例:

@RestController
public class ShortConnectionController {

    @PostMapping("/short-connection")
    public String shortConnection(@RequestBody String message) {
        // 处理客户端发送的消息
        System.out.println("Message from client: " + message);
        // 返回响应
        return "Hello, client!";
    }
}

二、长连接(Long Connection)

长连接是一种持久性连接,它在建立后可以保持打开状态一段时间,以便在需要时进行多次数据传输。与短连接相比,长连接可以减少连接建立和断开的开销,提高通信效率。WebSocket 通信就是一种典型的长连接方式,它可以实现双向通信,并支持实时更新和推送。

客户端示例:

const socket = new WebSocket('ws://localhost:8080/long-connection');

socket.onopen = function(event) {
  console.log('Connected to server');
  socket.send('Hello, server!');
};

socket.onmessage = function(event) {
  console.log('Response from server:', event.data);
};

服务端示例:

@Component
public class LongConnectionHandler extends TextWebSocketHandler {

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("Client connected: " + session.getId());
        session.sendMessage(new TextMessage("Hello, client!"));
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        System.out.println("Message from client: " + message.getPayload());
        session.sendMessage(new TextMessage("Hello, client!"));
    }
}

三、短轮询(Short Polling)

短轮询是一种通过定期发送 HTTP 请求来获取更新的数据的方法。在短轮询中,客户端定期向服务器发送请求,服务器立即响应,无论是否有新数据可用。虽然简单易实现,但短轮询会导致频繁的网络请求和服务器负载,并且实时性较差。

客户端示例:

function shortPolling() {
  fetch('http://localhost:8080/data')
    .then(response => response.text())
    .then(data => {
      console.log('Response from server:', data);
      setTimeout(shortPolling, 5000); // 5秒后再次发送请求
    })
    .catch(error => {
      console.error('Error:', error);
      setTimeout(shortPolling, 5000); // 5秒后再次发送请求
    });
}

// 启动短轮询
shortPolling();

服务端示例:

@RestController
public class ShortPollingController {

    @GetMapping("/data")
    public String getData() {
        // 处理数据请求
        return "Data from server";
    }
}

四、长轮询(Long Polling)

长轮询是一种改进型的轮询技术,它在没有新数据可用时不会立即返回响应,而是将请求挂起一段时间,直到有新数据可用或超时后再返回响应。这种方式可以减少不必要的网络请求,提高实时性。在长轮询中,服务器需要支持请求挂起和超时处理,以及在有新数据时立即响应。

客户端示例:

function longPolling() {
  fetch('http://localhost:8080/long-polling')
    .then(response => response.text())
    .then(data => {
      if (data !== '') {
        console.log('Response from server:', data);
      }
      longPolling(); // 再次发送请求
    })
    .catch(error => {
      console.error('Error:', error);
      longPolling(); // 再次发送请求
    });
}

// 启动长轮询
longPolling();

服务端示例:

@RestController
public class LongPollingController {

    private DeferredResult<String> deferredResult = new DeferredResult<>();

    @GetMapping("/long-polling")
    public DeferredResult<String> longPolling() {
        // 设置超时处理
        deferredResult.onTimeout(() -> deferredResult.setResult(""));

        return deferredResult;
    }

    // 当有新数据可用时调用该方法,向客户端推送数据
    public void pushData(String data) {
        deferredResult.setResult(data);
    }

    // 模拟定时检查数据更新,并推送数据给客户端
    @Scheduled(fixedRate = 5000) // 每5秒执行一次
    public void checkDataUpdate() {
        String newData = "New data"; // 获取新数据
        pushData(newData); // 推送数据给客户端
    }
}

五、小结

在网络通信中,短连接、长连接、短轮询和长轮询是四种常见的通信方式。短连接和长连接主要涉及到连接的建立和维持,其中短连接在每次请求后都会断开,而长连接则在一段时间内保持连接状态。短轮询和长轮询则是两种常见的轮询方式,短轮询是客户端不断地向服务器发送请求,而长轮询则是客户端发送请求后,服务器在有新消息时才返回响应。

推荐阅读

  1. Zookeeper 注册中心:单机部署
  2. 【JavaScript】探索 JavaScript 中的解构赋值
  3. 深入理解 JavaScript 中的 Promise、async 和 await
  4. 探索生产者/消费者模式:解决并发编程中的资源竞争
  5. 深入探究 Spring Boot Starter:从概念到实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值