所以我有这个非常简单的类,它扩展了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?
答案 0 :(得分:1)
但为什么我的应用程序会响应来自同一本地端口的两个请求?
因为这就是TCP的工作方式。
TCP不应该创建不同的端口并从那里做出响应吗?
没有
同样在HeadFirst JSP和Servlets预订中说:
"存在差异,因为虽然请求被发送到单个端口(服务器正在侦听,但服务器转向并为每个线程找到不同的本地端口,以便应用程序可以处理多个客户同时"
有理由避免这本书。这完全是错误的。从同一个侦听套接字接受的所有套接字共享其本地端口号。服务器没有转身,找到一个不同的本地端口'对于每个线程'完全没有必要这样,以便应用程序可以同时处理多个客户端'。这已经得到TCP的保证。
那为什么两个都是8080?
见上文。
这是一个令人惊讶的关于TCP的常见误解,但仍然存在误解。