Servlet混合会话响应

时间:2013-05-03 10:45:14

标签: java servlets


我正在开发Android打印应用程序。我的应用程序的一部分是从用户接收文件的本地服务器。
我在Tomcat Java servlet中实现了服务器。

我的问题是,当两台设备即时向服务器发送2个文件时,有两种可能的结果:
1.一个客户端收到良好响应,第二个客户端收到空响应 2.一个客户端收到第二个客户端的响应,反之亦然。

这是我的servlet代码:

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

            @Override
            public void run() {
                try {
                    request.setCharacterEncoding("UTF-8");
                } catch (UnsupportedEncodingException e2) {
                    // TODO Auto-generated catch block
                    e2.printStackTrace();
                }
                response.setCharacterEncoding("UTF-8");
                try {
                    writer = response.getWriter();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    // get access to file that is uploaded from client
                    Part p1 = request.getPart("File");
                    InputStream is = p1.getInputStream();

                    // read filename which is sent as a part
                    Part p2  = request.getPart("MetaData");
                    Scanner s = new Scanner(p2.getInputStream());
                    String stringJson = s.nextLine();    // read filename from stream
                    s.close();

                    json = new JSONObject(stringJson);
                    fileName = new String(json.getString("FileName").getBytes("UTF-8"));
                    fileDirectory = BASE + request.getSession().getId();
                    File dir = new File(fileDirectory);
                    dir.mkdir();
                    // get filename to use on the server
                    String outputfile = BASE + dir.getName() + "/" + fileName;  // get path on the server
                    FileOutputStream os = new FileOutputStream (outputfile);

                    // write bytes taken from uploaded file to target file
                    byte[] buffer = new byte[1024];
                    int ch = is.read(buffer);
                    while (ch != -1) { 
                        os.write(buffer);
                        ch = is.read(buffer);
                    }
                    os.close();
                    is.close();
                }
                catch(Exception ex) {
                    writer.println("Exception -->" + ex.getMessage());
                }
                finally { 
                    try {
                        myRequest = request;
                        try {
                            printFile(request.getSession().getId());
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            writer.println("Exception -->" + e.getMessage());
                        }
                        writer.close();
                    } catch (InterruptedException e) {
                        writer.println("Exception -->" + e.getMessage());
                    }
                }               
            }
        }.run();

    }

tomcat服务器作为虚拟机在Ubuntu 13.04上运行 有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您无需实现Runnable。默认情况下,Servlet是线程安全的,这意味着为每个请求创建一个新线程。如果您使用的是某些静态变量,请确保以线程安全的方式使用它们。我认为你的线程创建可能会困扰tomcat /容器以不正确的方式发送响应。总之,我相信你所做的工作超出了要求,容器就在那里为你解救。

答案 1 :(得分:0)

任何Web容器都管理servlet的多线程。您无需实现自己的线程。从代码中删除多线程,它将完美运行。

答案 2 :(得分:0)

我不认为Runnable的使用有所不同,但它有点毫无意义。我看不出你宣布你作家的地方。如果这是servlet的实例变量(即不在post方法中),那么当由两个会话同时使用时,该那个易于进行会话交换。尝试在post方法中声明它。