在前面几篇文章中已经实现了移动端Server的关键前两步:监听远程连接和解析HTTP Headers中的数据,本文将要设计一下路由规则
1.URL路由规则
简单来讲就是客户端请求一个URL,服务器分发给哪个服务来处理
移动端Server要实现两个功能:
- 让其他设备打开APP中内置好的页面
- 接收其他设备传输给APP的图片
我们对这两种行为定义路由规则:
/static/ :定义为下载文件的访问路径
/imageupload/ :定义为上传文件的访问路径
2.实现思路
- 获取URL相对路径
- 定义IUriResourceHandler并注册相应的方法
- 遍历Handler
3.获取URL相对路径
在onAcceptRemotePeer中获取URL,只需要获取头信息的第一行,很简单
String resourceUri = StreamToolKit.readLine(in).split(" ")[1];
System.out.print("resourceUri is :" + resourceUri);
4.定义IUriResourceHandler并注册相应的方法
public interface IUriResourceHandler {
boolean accept(String uri);
void handle(String uri, HttpContext httpContext);
}
实现类ResourceInAssetsHandler处理下载请求
public class ResourceInAssetsHandler implements IUriResourceHandler {
private String mAcceptPrefix = "/static/";
@Override
public boolean accept(String uri) {
return uri.startsWith(mAcceptPrefix);//以prefix结尾时返回true
}
@Override
public void handle(String uri, HttpContext httpContext) throws IOException {
OutputStream os = httpContext.getUnderlySocket().getOutputStream();
PrintWriter writer = new PrintWriter(os);
writer.println("HTTP/1.1 200 OK");
writer.println();
writer.println("from resource in assets handler");
writer.flush();
}
}
实现类UploadImageHandler处理上传请求
public class UploadImageHandler implements IUriResourceHandler {
private String mAcceptPrefix = "/upload_image/";
@Override
public boolean accept(String uri) {
return uri.startsWith(mAcceptPrefix);//以prefix结尾时返回true
}
@Override
public void handle(String uri, HttpContext httpContext) throws IOException {
OutputStream os = httpContext.getUnderlySocket().getOutputStream();
PrintWriter writer = new PrintWriter(os);
writer.println("HTTP/1.1 200 OK");
writer.println();//输出\r\n
writer.println("from upload image handler");
writer.flush();
}
}
在SimpleHttpServer中增加注册Handler方法
public void registerResourceHandler(IUriResourceHandler handler){
mResourceHandlers.add(handler);
}
在MainActivity中注册两个Handler
mSimpleServer = new SimpleHttpServer(webConfig);
mSimpleServer.registerResourceHandler(new ResourceInAssetsHandler());
mSimpleServer.registerResourceHandler(new UploadImageHandler());
mSimpleServer.startAsync();
5.遍历Handler
在onAcceptRemotePeer中while循环后增加对Handlers的遍历
for (IUriResourceHandler handler : mResourceHandlers) {
if (!handler.accept(resourceUri))
continue;
handler.handle(resourceUri, httpContext);
}
6.运行验证
在浏览器中输入http://192.168.1.104:8088/static/1
http://192.168.1.104:8088/upload_image/1
这篇就到这里结束了,最后还是附上github源码地址:
https://github.com/jianiuqi/AndroidServer