Actually, HTTP-based servers can't "push" at all. At best all you can do is "tug".
This isn't just a
J2EE thing. The HTTP protocol strictly defines how this works:
1. The client opens a connection to the server (usually port 80, 443, although others also work such as 8080, 8443 depending on the server).
2. The client opens a reply port to listen on.
3. The client sends an HTTP request to the server. That request includes the reply port number as part of its overhead.
4. The server, which has been listening for requests, accepts the request, dispatches it to back-end logic which generates response data.
5. The server sends the response data to the listening reply port on the client.
6. The client closes its connections to the server and renders the response (usually as a web page).
There are no long-term open connections. The connections remain only as long as it takes to service a request and receive a reply. The next request starts it all over again. No reply can be sent ("pushed") except in response to a request.