什么是长连接和短连接

  1. 长连接:
    所谓长连接是客户端和服务器建立起一个网络连接后,客户端和服务器都不会主动去断开这个连接,并且用一个侦听线程不断侦听着对端发送来的消息。
  2. 短连接:
    当需要传输信息时,客户端和服务器建立一个连接。客户端发送请求,服务器发回响应。通信结束连接就断开。客户端和服务器都不存在线程侦听对端消息。
    过程:
    1、连接;
    2、客户端向服务器发送“请求”;
    3、服务器获取请求,并处理得到结果;
    4、服务器向客户端返回“响应”;
    5、断开。

采用轮询方式的短连接

B/S模式下,若采用上述短连接方式,浏览器向服务器去请求资源,每请求一次就需要完整的执行一个 连接-请求-断开 的一个过程。而如今,光一个网页,浏览器就需要向服务器发送几百次请求,如果还是纯粹的短连接,浏览网页的体验会很差。

改进

客户端和服务器建立连接并结束一次通信后,服务器把“客户端网络连接”(Socket对象)放入服务器缓存区的一个池子中,并给这个池子设置maxCount,再对这个池子持续监听,如果其中的某个客户端连接有请求发送,则可以直接发送,不用再连接。

客户端具体过程
  1. 连接请求
    先判断是都已经存在连接;
    若存在,则完成“连接”操作
    若不存在,则真正连接服务器
  2. 发送请求过程
    若连接有效,则发送请求
  3. 等待响应
    同步模式:等到接受到响应在进一步处理信息
    异步模式:采用一个侦听线程来侦听服务器回应的消息
  4. 断开连接
服务器具体过程
  1. 俩种方式连接方式且都是被动的连接
    1. accept()接收到的新的客户端连接
    2. 轮询发现客户端有请求
  2. 接受客户端的请求
  3. 处理请求
  4. 发送响应给客户端
  5. “断开”连接
    若池子未满,则把他放入池子中
    若池子已满,则对池子进行新老交替,把很长时间没发送请求的踢出去,把新的加入。

总结

轮询方式下的短连接并不是纯粹的短连接,并没有做到通信玩就断开连接。真正的物理断开只存在于服务器池中客户端连接“新老交替”时。
客户端发送请求部分本身就是一个线程,并且这个线程应该由某些事件来触发,异步模式下这个线程还会创造出一个不断侦听服务器回应的线程。