【问题标题】:File transfer with Jetty使用 Jetty 传输文件
【发布时间】:2017-01-29 20:45:56
【问题描述】:
晚安,团队,
我的任务是使用码头创建简单的文件传输(概念证明)。想法将文件从我的 java 桌面应用程序 #1 上传到 Jetty Web 服务器,然后将此文件从应用程序 #2 下载到某个地方。
我使用 io 和 nio(简单的客户端-服务器-客户端应用程序)来实现。是否可以使用 Jettyweb 服务器来完成?目前我有客户端应用程序,它只是向服务器发送 POST 请求并得到它的响应。
我阅读了http://www.eclipse.org/jetty 上的文档,但遗憾的是没有找到关于我的问题的答案。感谢任何帮助。
【问题讨论】:
标签:
java
jetty
embedded-jetty
【解决方案1】:
我自己做的,答案是可能的。下面是服务器上的代码示例:
package Server.src;
import ClientServer.model.Envelope;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Level;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
public class WebServer {
public static class EmbeddedAsyncServlet extends HttpServlet {
Envelope envelope = new Envelope();
public static ArrayList<Envelope> envelopeList = new ArrayList<>();
public static int i;
public static int index;
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
final AsyncContext ctxt = req.startAsync();
ctxt.start(new Runnable() {
@Override
public void run() {
System.err.println("Do get");
String get = req.getParameter("UUID");
try {
if (checkListForMessage(get)==true) {
try {
System.out.print("eeeeeeeeee");
byte[] b = serialize(envelopeList.get(index));
String encoded = new String(Base64.encodeBase64(b));
resp.getWriter().append(encoded);
envelopeList.remove(index);
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
ctxt.complete();
}
});
}
@Override
protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
final AsyncContext ctxt = req.startAsync();
ctxt.start(new Runnable() {
@Override
public void run() {
System.err.println("Do post");
try {
String s = req.getParameter("key1");
byte[] decoded = Base64.decodeBase64(s);
envelope = (Envelope) deserialize(decoded);
if (checkListForPair(envelope.userIdentifier, envelope.clientIdentifier) == false) {
envelopeList.add(envelope);
resp.getWriter().append("Approved");
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
ctxt.complete();
}
});
}
public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream b = new ByteArrayInputStream(bytes);
ObjectInputStream o = new ObjectInputStream(b);
return o.readObject();
}
public static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream b = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(b);
o.writeObject(obj);
return b.toByteArray();
}
public static Boolean checkListForPair(String user, String client) {
for (Envelope envelope : envelopeList) {
if (envelope.userIdentifier.equals(user) & envelope.clientIdentifier.equals(client)) {
return true;
}
}
return false;
}
public static Boolean checkListForMessage(String client) {
i=-1;
for (Envelope envelope : envelopeList) {
i++;
if (envelope.clientIdentifier.equals(client)) {
index=i;
return true;
}
}
return false;
}
}
public static void main(String[] args) throws Exception {
org.apache.log4j.LogManager.getLogger("org.eclipse.jetty").setLevel(Level.WARN);
Server server = new Server(1883);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
context.setAllowNullPathInfo(true);
ServletHolder asyncHolder = context.addServlet(EmbeddedAsyncServlet.class, "/");
asyncHolder.setAsyncSupported(true);
server.setHandler(context);
server.start();
server.join();
}
}