为什么httpServletRequest.getLocalPort始终使用getServerPort返回相同的值?

时间:2014-04-06 10:00:56

标签: java tomcat servlets web-applications tcp

所以我有这个非常简单的类,它扩展了HttpServlet类并实现了doPost方法。

我在doPost方法中有这个:

System.out.println("Remote port:" + httpServletRequest.getRemotePort());
System.out.println("Local port:" + httpServletRequest.getLocalPort());
System.out.println("Server port:" + httpServletRequest.getServerPort());

我打开Internet Explorer和Chrome,并尽可能快地使用这两种浏览器访问此Servlet。我得到了输出:

Remote port:51773
Local port:8080
Server port:8080
Remote port:51772
Local port:8080
Server port:8080

所以我可以看到Chrome和Internet Explorer从操作系统获得不同的TCP端口。 (773和772)但为什么我的应用程序响应来自同一本地端口的两个请求? TCP不应该创建不同的端口并从那里做出响应吗?

同样在HeadFirst JSP和Servlets预订中说:

  

"有区别,因为虽然请求被发送到了   单端口(服务器正在侦听,服务器转向   并为每个线程找到一个不同的本地端口,以便应用程序可以   同时处理多个客户"

那为什么两个都是8080?

1 个答案:

答案 0 :(得分:1)

  

但为什么我的应用程序会响应来自同一本地端口的两个请求?

因为这就是TCP的工作方式。

  

TCP不应该创建不同的端口并从那里做出响应吗?

没有

  

同样在HeadFirst JSP和Servlets预订中说:

     

"存在差异,因为虽然请求被发送到单个端口(服务器正在侦听,但服务器转向并为每个线程找到不同的本地端口,以便应用程序可以处理多个客户同时"

有理由避免这本书。这完全是错误的。从同一个侦听套接字接受的所有套接字共享其本地端口号。服务器没有转身,找到一个不同的本地端口'对于每个线程'完全没有必要这样,以便应用程序可以同时处理多个客户端'。这已经得到TCP的保证。

  

那为什么两个都是8080?

见上文。

这是一个令人惊讶的关于TCP的常见误解,但仍然存在误解。