Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从servlet向所有登录用户发送数据_Java_Servlets_Servlet Filters_Servlet 3.0_Servlet Listeners - Fatal编程技术网

Java 如何从servlet向所有登录用户发送数据

Java 如何从servlet向所有登录用户发送数据,java,servlets,servlet-filters,servlet-3.0,servlet-listeners,Java,Servlets,Servlet Filters,Servlet 3.0,Servlet Listeners,我的要求是管理员应该向所有登录的用户发送数据。我有一个servlet第一个用户发送登录HTTP req并从servlet获得登录成功响应,现在该用户的会话已启动。类似地,其他用户登录。现在,管理员(也是一个用户)可以登录并看到两个用户user1和user2登录。管理员应向所有登录用户发送数据。Servlet应该将数据推送到该用户,而无需用户HTTP请求。请注意,在会话期间,用户不会发送任何其他HTTP请求 我没有使用comet,而是尝试存储每个登录用户的响应obj,然后使用该obj尝试将数据发回

我的要求是管理员应该向所有登录的用户发送数据。我有一个servlet第一个用户发送登录HTTP req并从servlet获得登录成功响应,现在该用户的会话已启动。类似地,其他用户登录。现在,管理员(也是一个用户)可以登录并看到两个用户user1和user2登录。管理员应向所有登录用户发送数据。Servlet应该将数据推送到该用户,而无需用户HTTP请求。请注意,在会话期间,用户不会发送任何其他HTTP请求

我没有使用comet,而是尝试存储每个登录用户的响应obj,然后使用该obj尝试将数据发回给用户,但没有成功

请检查以下代码:LoginServlet.java

    public class LoginServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        ServletContext sc;

        protected ArrayList<HttpServletResponse> connections = new ArrayList<HttpServletResponse>();

        public LoginServlet() {
            super();

        }

        public void init() throws ServletException {
            super.init();

            sc = getServletContext();

        }

        protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {

        }

        protected void doPost(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {


            synchronized (connections) {
                connections.add(response);
            }
            ServletContext sc = getServletContext();
            Integer x = (Integer) sc.getAttribute("hit");

            if (x == null)
                x = 1;
            else
                x++;
            sc.setAttribute("hit", x);

            String username = request.getParameter("username");
            String password = request.getParameter("password");

            HttpSession session = request.getSession(true);

            session.setAttribute("username", username);
            session.setAttribute("password", password);
            response.setContentType("text/html");

            ArrayList<LoggedInUser> loggedInUsers = (ArrayList<LoggedInUser>) sc
                    .getAttribute("users");

            if (loggedInUsers == null) {
                System.out.println("loggedInUsers creates");
                loggedInUsers = new ArrayList<LoggedInUser>();

            }
            loggedInUsers.add(new LoggedInUser(username, password));

            sc.setAttribute("users", loggedInUsers);

            PrintWriter out = response.getWriter();
            System.out.println("loggedInUsers ==>" + loggedInUsers.size());
            if (username != null && username.equals("admin")) {
                out.println("Admin Login Success");
                ServletContext scx = getServletContext();
                Integer xx = (Integer) scx.getAttribute("hit");

                out.println("<H1>Users visited " + xx + "</h1>");
                loggedInUsers = (ArrayList<LoggedInUser>) sc.getAttribute("users");

                for (int i = 0; i <= loggedInUsers.size() - 1; i++) {
                    LoggedInUser LoggedInUser = loggedInUsers.get(i);
                    out.println(LoggedInUser.getmUsername()+ "<br>");
                }

                for (int i = 0; i < connections.size(); i++) {

                    try {

                        LoggedInUser LoggedInUser = loggedInUsers.get(i);
                        PrintWriter writer = connections.get(i).getWriter();
                        System.out.println("inside loope " + i + "\n" + writer);
                        writer.println("MESSAGE FROM ADMIN HERE" + "<br>");

                        writer.flush();
                        writer.close();
                    } catch (IOException e) {
                        log("IOExeption sending message", e);
                    }

                }

            } else {
                out.println("Welcome   " + username + "   Login Success");
            }
        }
    }
后来使用这个obj得到了printwriter obj

PrintWriter writer = connections.get(i).getWriter();  
问题:

  • 如何向所有登录用户发送一条特定消息
  • 没有彗星,我们能做到这一点吗 如果我做了什么错误,请更正代码,并提供其他建议。谢谢

    Servlet应该将数据推送到该用户,而无需用户HTTP请求

    这在技术上是不可能的。HTTP协议根本不允许这样做。浏览器只有在发送请求时才能从服务器获得响应。一旦完成读取响应,它将不再尝试从其套接字读取任何内容。。。直到它发送下一个请求

    您可以在所有页面中添加一些javascript,这些页面定期向服务器发出AJAX请求,询问是否要显示管理消息

    我想你也可以用COMET来做这件事

    当前保留最后一个响应并尝试向其写入更多数据的方法失败,因为它违反了HTTP协议和servlet状态机。当登录servlet完成原始请求时,响应的输出流被刷新到套接字并关闭。它无法重新打开,即使可以,浏览器也不知道如何处理您编写的数据

    更新:有一个变化,这可能会工作。它涉及WebSocket。。。其中,客户端在请求中发送一些特殊的报头,服务器发送101响应并切换协议;看

    Servlet应该将数据推送到该用户,而无需用户HTTP请求

    这在技术上是不可能的。HTTP协议根本不允许这样做。浏览器只有在发送请求时才能从服务器获得响应。一旦完成读取响应,它将不再尝试从其套接字读取任何内容。。。直到它发送下一个请求

    您可以在所有页面中添加一些javascript,这些页面定期向服务器发出AJAX请求,询问是否要显示管理消息

    我想你也可以用COMET来做这件事

    当前保留最后一个响应并尝试向其写入更多数据的方法失败,因为它违反了HTTP协议和servlet状态机。当登录servlet完成原始请求时,响应的输出流被刷新到套接字并关闭。它无法重新打开,即使可以,浏览器也不知道如何处理您编写的数据


    更新:有一个变化,这可能会工作。它涉及WebSocket。。。其中,客户端在请求中发送一些特殊的报头,服务器发送101响应并切换协议;请参见

    嘿,您使用的java表示技术是什么?Java Server Faces、Wicket、JSP、Struts、Spring?@peter难道我们不能存储响应obj并使用该obj发送消息吗?@peter simple servlet JSP使用Tomcatt当servlet完成工作时,连接处于脱机状态!您应该将消息存储在会话中。您是否像jQuery一样使用javascript?所以您想在HTTP保护伞下发明新的通信模型?;-)“HTTP在客户机-服务器计算模型中起到请求-响应协议的作用”嘿,你使用什么java表示技术?Java Server Faces、Wicket、JSP、Struts、Spring?@peter难道我们不能存储响应obj并使用该obj发送消息吗?@peter simple servlet JSP使用Tomcatt当servlet完成工作时,连接处于脱机状态!您应该将消息存储在会话中。您是否像jQuery一样使用javascript?所以您想在HTTP保护伞下发明新的通信模型?;-)“HTTP在客户机-服务器计算模型中起到请求-响应协议的作用”Comet或websockets或很快webRTC dataChannel@stephen实际上,我将从android应用程序中点击URL,而不是从android浏览器或PC web浏览器。是否有其他替代方案来实现这一点?通过android应用程序,用户将获得连接,管理员将随时向所有用户或某些选定用户推送数据。对于android,我们有GCM谷歌云到设备的消息服务,但这将是开销,因为GCM只是通知android应用程序服务器端有新数据可用,所以用户再次必须点击服务器获取数据。所以我想为什么不将数据从服务器推送到用户。让我知道你对此的想法。“所以我想为什么不将数据从服务器推送到用户。让我知道你对此的想法。”-我的想法是1)我不知道你会怎么做。2) 为什么要给自己制造麻烦呢?Comet或websockets或很快webRTC dataChannel@stephen事实上,我将从android应用程序中点击URL,而不是从android浏览器或PC web浏览器。是否有其他替代方案来实现这一点?通过android应用程序,用户将获得连接,管理员将随时向所有用户或某些选定用户推送数据。对于android,我们有GCM谷歌云到设备的消息服务,但这将是开销,因为GCM只是通知android应用程序服务器端有新数据可用,所以用户再次必须点击服务器获取数据。所以我想为什么不将数据从服务器推送到用户。让我知道你的想法
    PrintWriter writer = connections.get(i).getWriter();