0


Android 印刷アプリケーションを開発しています。私のアプリケーションの一部は、ユーザーからファイルを受け取るローカル サーバーです。
Tomcat Java サーブレットでサーバーを実装しました。

私の問題は、2 つのデバイスが 2 つのファイルをサーバーに瞬時に送信すると、2 つの結果が考えられること
です。
2. 1 つのクライアントが 2 番目のクライアントの応答を受信し、その逆も同様です。

ここに私のサーブレットコードがあります:

    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 で実行されています。
何か案が?

4

3 に答える 3

0

Runnable を使用しても違いはないと思いますが、意味がありません。ライターを宣言した場所がわかりません。それがサーブレットのインスタンス変数である (つまり、post メソッドではない) 場合、2 つのセッションで同時に使用されると、セッション スワッピングが発生しやすくなります。post メソッド内で宣言してみてください。

于 2013-05-03T11:00:24.423 に答える
0

Web コンテナは、サーブレットのマルチスレッドを管理します。独自のスレッドを実装する必要はありません。コードからマルチスレッドを削除すると、完全に機能します。

于 2013-05-03T10:51:58.883 に答える
0

Runnable を実装する必要はありません。デフォルトでは、サーブレットはスレッド セーフです。つまり、リクエストごとに新しいスレッドが作成されます。いくつかの静的変数を使用している場合は、それらをスレッド セーフな方法で使用するようにしてください。スレッドの作成により、Tomcat/コンテナが誤った方法で応答を送信するのに問題が発生している可能性があると思います。要するに、あなたは必要以上のことをしていると思います.コンテナはあなたの救助のためにそこにあります.

于 2013-05-03T10:50:24.027 に答える