可以。
今天在看http,看到keep-alive讲解的时候说到该字段可以让连接保持更长时间,达到让多个Http请求复用同一条TCP连接的效果。基于之前java编程的经验,我首先就想到了如果一个port已经被绑定了,再绑定时就会报错,那么,多个Http请求又是怎么复用同一条TCP连接的呢?捋了捋,是我理解错了。先看下最常见的socket服务端代码
public static Thread server = new Thread(){
@Override
public void run() {
try {
ServerSocket serverSocket=new ServerSocket(10110);
Socket tempSocket = null;
while (true){
tempSocket = serverSocket.accept();//阻塞方法,只要有连接连上来就能监听到
// do something
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
即,在端口 10110 启动一个服务端socket,然后一直监听,一旦有客户端的socket连接上来就处理。此时,如果你再在10110端口启动一个serversocket确实会发生异常,但是可以接收多个客户端的socket连接。socket是http请求的底层基础,一个http请求就对应着一个底层的客户端socket,而serversocket正是http服务端的底层基础。一条TCP连接是什么?源 IP 地址、源端口、目的 IP 地址、目的端口这四项就会确定一条TCP连接,换句话说,这四个值组合起来就是一条TCP的身份证,不会重复。当第一个http请求发出去后,一条TCP连接确定下来了(假设源IP 192.168.1.102、源port 10112,目的IP 192.168.1.101,目的port 10110),这个http请求结束后,这条连接并没有马上关闭(例如,connection:keep-alive时),几秒钟后,客户端又发起了一次请求,该请求仍然使用的上次的 源IP 192.168.1.102、源port 10112,目的IP 192.168.1.101,目的port 10110,这样就不必再重建一条TCP连接而是复用上次的就可以了,这样就达到了同一条TCP连接供多个http请求复用的效果。至于每次http请求的功能,则完全由应用层来决定即可,例如第一次http请求是下载一张图片,第二次请求也可以是下载一张图片,也可以是单单传达一个字符串,只要客户端根据需求传送不同的参数,服务端根据接收到的不同参数做出不同的回应即可。