【Android】手机端使用NanoHTTPD搭建服务器

序言

NanoHTTPD 是一个轻量级的 Java HTTP 服务器库,可以在应用程序中快速搭建一个简单的 HTTP 服务器。

准备工作

引入依赖

java 复制代码
implementation 'org.nanohttpd:nanohttpd:2.3.1'

添加网络访问权限

xml 复制代码
<uses-permission android:name="android.permission.INTERNET" />
搭建服务器

项目中创建一个名为 MyServer 的类,并继承自 NanoHTTPD。在该类中,实现 serve 方法来处理请求。

java 复制代码
import android.content.Context;

import fi.iki.elonen.NanoHTTPD;

import java.io.IOException;
import java.util.Map;

public class MyServer extends NanoHTTPD {

    private Context context;

    public MyServer(Context context) {
        super(8080);
        this.context = context;
    }

    @Override
    public Response serve(IHTTPSession session) {
        String uri = session.getUri();
        
        // 处理 GET 请求
        if (session.getMethod() == Method.GET) {
            switch (uri) {
                case "/hello":
                    return newFixedLengthResponse("Hello, World!");
                case "/time":
                    String currentTime = getCurrentTime();
                    return newFixedLengthResponse(currentTime);
                default:
                    return newFixedLengthResponse("Invalid path");
            }
        }
        
        // 处理 POST 请求
        if (session.getMethod() == Method.POST) {
            if ("/upload".equals(uri)) {
                try {
                    // 解析 POST 请求的参数
                    Map<String, String> files = session.getParms();
                    
                    // 处理上传的文件等逻辑
                    // ...
                    
                    return newFixedLengthResponse("Upload successful");
                } catch (IOException e) {
                    e.printStackTrace();
                    return newFixedLengthResponse("Upload failed: " + e.getMessage());
                }
            }
        }
        
        return newFixedLengthResponse(Response.Status.NOT_FOUND, NanoHTTPD.MIME_PLAINTEXT, "Not found");
    }
    
    private String getCurrentTime() {
        // 获取当前时间的逻辑
        // ...
        return "Current time: " + System.currentTimeMillis();
    }
}

在 serve 方法中,我们首先检查请求的方法,如果是 GET 方法,我们根据不同的路径返回不同的响应。例如,当访问 /hello 路径时,服务器将返回 "Hello, World!"。当访问 /time 路径时,服务器将返回当前时间。

如果是 POST 方法,并且路径为 /upload,则我们可以处理上传的文件等逻辑。在这个例子中,我们只是简单地返回上传成功或失败的消息。

最后,如果无法匹配到合适的路径,则返回 "Not found"。

启动服务器

创建 MyServer 的实例,并调用 start 方法来启动服务器。

java 复制代码
public class MainActivity extends AppCompatActivity {

    private MyServer server;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 创建服务器实例并启动
        server = new MyServer(this);
        try {
            server.start();
            Log.d("Server", "Server started");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        
        // 停止服务器
        if (server != null) {
            server.stop();
        }
    }
}

一旦服务器启动,可以在设备或模拟器上的浏览器中输入 http://localhost:8080/hellohttp://localhost:8080/time 等地址,来查看服务器返回的响应。

相关推荐
rising_chain31 分钟前
Uniapp 引入 Android aar 包 和 Android 离线打包
android·uni-app·uniapp 离线打包
渗透测试老鸟-九青2 小时前
通过组合Self-XSS + CSRF得到存储型XSS
服务器·前端·javascript·数据库·ecmascript·xss·csrf
风兮雨露2 小时前
Linux(CentOS 7) yum一键安装mysql8
linux·服务器·mysql
祭の3 小时前
什是服务器器和Apache Tomcat介绍(笔记)
运维·服务器·笔记
IT闫3 小时前
【Git从入门到精通】——Git分支介绍与GitHub相关知识总结
github
Tankoldbang3 小时前
github 以及 huggingface下载模型和数据
github
.生产的驴4 小时前
Docker 部署Nacos 单机部署 MYSQL数据持久化
android·运维·spring boot·sql·mysql·docker·容器
TF男孩4 小时前
再探老开源项目Tesseract,这次的OCR识别稍微会用了
人工智能·github·图像识别
van叶~4 小时前
Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(1)
linux·服务器
MetaverseMan4 小时前
Cloudflare代理后的https连接的建立还是从源客户端到服务器端握手协商的连接吗
网络协议·https·github