Java 用于接收和共享流数据的Servlet

Java 用于接收和共享流数据的Servlet,java,multithreading,jsp,servlets,Java,Multithreading,Jsp,Servlets,我有三个程序(a-b-c):a启动b,当c结束a重新启动b时,处理c。我只能更改b,但它不稳定,因为它已重新启动。我想用一个servlet服务来解决我的问题,该服务接收b数据和错误,并立即将它们显示在网页上。我试过两种方法:1。在与servlet并行的线程中接收数据并与之共享(我没有成功);2.从客户端接收数据并与ServletContext共享,并使用sent event刷新页面,但跳过行,即使使用retry:100,并在没有新数据时重复最后一行。有没有一种方法可以只在所有servlet客户机

我有三个程序(
a
-
b
-
c
):
a
启动
b
,当
c
结束
a
重新启动
b
时,处理
c
。我只能更改
b
,但它不稳定,因为它已重新启动。我想用一个servlet服务来解决我的问题,该服务接收
b
数据和错误,并立即将它们显示在网页上。我试过两种方法:1。在与servlet并行的
线程中接收数据并与之共享(我没有成功);2.从客户端接收数据并与ServletContext共享,并使用sent event刷新页面,但跳过行,即使使用retry:100,并在没有新数据时重复最后一行。有没有一种方法可以只在所有servlet客户机都是新客户机时才向它们发送数据?考虑到
b
重新启动并且我必须限制使用的端口,是否有更好的解决方案

--更新-- Servlet.java

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

@WebServlet(name = "Servlet", urlPatterns = {"/Servlet", "/test"})
public class Servlet extends HttpServlet {

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Connection", "keep-alive");
        response.setContentType("text/event-stream");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Cache-Control", "no-cache");
        String datain = request.getParameter("StringIn");
        String dataold = request.getParameter("StringOld");
        PrintWriter writer = response.getWriter();

        if (datain == null) {
            boolean test = getServletContext().getAttribute("actualData").equals(request.getParameter("StringOld"));
            if (!test) {
                writer.write("data: " + getServletContext().getAttribute("actualData") +"\n\n");
                writer.write("retry: 500");
            }
            else {
                writer.write("data: \n\n");
                writer.write("retry: 1000");
            }
        }
        else {
            getServletContext().setAttribute("actualData", datain);
            writer.write("data receive!\n\n");
        }
        writer.flush();
        writer.close();
    }
}
脚本index.jsp

var eventSource = null;
var oldmessage = "";
var path = "http://localhost:8080/Servlet?StringaOld=";
function start() {
    eventSource = new EventSource(path + oldmessage);
    eventSource.onopen = function () {
    };
    eventSource.onmessage = function (message) {
        var mex = message.data;
        message.data = null;
        if (mex != null) {
            oldmex = mex;
            testo.value += mex + "\n";
        }
    };
    eventSource.onerror = function (error) {
        eventSource = new EventSource(path + encodeURI(oldmessage));
    };
    Start.disabled = true;
}

function stop() {
    eventSource.close();
    Start.disabled = false;
}

非常宽泛,写得很差question@JacekCz只能在更新值时发送状态事件吗?我需要缓冲区还是即时缓冲区?我添加了一个代码示例!sevlet,安全背景线程是一个知识库(很难用简单的话来教授)。第二:我从未写过流媒体,我的评论的价值不会超过谷歌。第三:很难理解你的描述和代码。我没有太多