我正在开发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上运行 有什么想法吗?
答案 0 :(得分:0)
您无需实现Runnable。默认情况下,Servlet是线程安全的,这意味着为每个请求创建一个新线程。如果您使用的是某些静态变量,请确保以线程安全的方式使用它们。我认为你的线程创建可能会困扰tomcat /容器以不正确的方式发送响应。总之,我相信你所做的工作超出了要求,容器就在那里为你解救。
答案 1 :(得分:0)
任何Web容器都管理servlet的多线程。您无需实现自己的线程。从代码中删除多线程,它将完美运行。
答案 2 :(得分:0)
我不认为Runnable的使用有所不同,但它有点毫无意义。我看不出你宣布你作家的地方。如果这是servlet的实例变量(即不在post方法中),那么当由两个会话同时使用时,该那个易于进行会话交换。尝试在post方法中声明它。