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

序言

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

准备工作

引入依赖

implementation 'org.nanohttpd:nanohttpd:2.3.1'

添加网络访问权限

<uses-permission android:name="android.permission.INTERNET" />
搭建服务器

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

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 方法来启动服务器。

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/hello 或 http://localhost:8080/time 等地址,来查看服务器返回的响应。

相关推荐

  1. Android手机使用NanoHTTPD服务器

    2024-02-07 20:32:03       29 阅读
  2. 使用docker palworld 服务器

    2024-02-07 20:32:03       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-07 20:32:03       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-07 20:32:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-07 20:32:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-07 20:32:03       18 阅读

热门阅读

  1. 力扣:78. 子集

    2024-02-07 20:32:03       32 阅读
  2. 2024年-视觉AI检测的面试题目总结

    2024-02-07 20:32:03       29 阅读
  3. SouthLeetCode-打卡24年02月第1周

    2024-02-07 20:32:03       28 阅读
  4. CDN的深入理解+搭建自己的CDN

    2024-02-07 20:32:03       35 阅读
  5. IDEA2023SpingBoot只能勾选17和21

    2024-02-07 20:32:03       35 阅读
  6. Python 字符串追加

    2024-02-07 20:32:03       29 阅读
  7. Elasticsearch单个索引数据量过大的优化

    2024-02-07 20:32:03       38 阅读