上篇文章实现了三个接口:client、Server,RequestHandler并实现了client接口。
本文将实现网络模块的Server接口。
@Slf4j //日志
public class HttpTransportServer implements TransportServer {
private RequestHandler handler;//处理网络请求的handler,RequestHandler接口在上文实现。
private Server server;//jetty实现的Server
@Override
//初始化方法 需要做以下事情
public void init(int port, RequestHandler handler) {
this.handler = handler;
this.server = new Server(port);
//servlet接收请求
ServletContextHandler ctx = new ServletContextHandler();
server.setHandler(ctx);
//创建一个Servlet的holder 这是jetty在处理网络请求时的一个抽象,将创建的内部类Servlet通过参数传给holder
ServerHolder holder = new ServerHolder((com.sun.corba.se.spi.activation.Server) new RequestServlet());
ctx.addServlet(holder.toString(),"/*");
}
@Override
public void start() {
try {
server.start();//启动后有一个线程去监听,这个方法会立马返回。为了不让它立马返回。用join()
server.join();
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
@Override
public void stop() {
try {
server.stop();
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
//创建一个内部类 用于实现servlet
class RequestServlet extends HttpServlet{
//需要处理post请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
log.info("client connect");
//在client连接过来之后 发送数据过来,这里要拿到数据。
InputStream inputStream = req.getInputStream();
//处理过程中返回
OutputStream outputStream = resp.getOutputStream();
// init()方法 handler不为空,将in和out传给RequestHandler的onRequest方法
if(handler != null){
handler.onRequest(inputStream,outputStream);
}
outputStream.flush();
}
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容