杰瑞科技汇

Android Java服务器如何搭建与开发?

这个术语通常有几种可能的含义,我会为你逐一解析,并提供最常用、最现代的解决方案。

Android Java服务器如何搭建与开发?-图1
(图片来源网络,侵删)

在 Android 设备上运行一个 Java 服务器

这是最直接的理解,即让一部 Android 手机或平板电脑本身成为一个服务器,为其他设备提供服务。

常见应用场景:

  1. 文件共享:将手机上的文件(如照片、视频)通过 Wi-Fi 局域网共享给电脑或其他手机访问。
  2. 个人 Web 服务器:在手机上运行一个简单的网站或提供 API 接口,供同一局域网内的设备访问。
  3. 设备控制中心:一个 Android 设备作为家庭或办公室的控制中心,通过 API 接收其他设备的指令并控制硬件。
  4. 即时通讯/对战服务器:两个或多个玩家通过连接同一个设备(作为服务器)来进行游戏或聊天,而不是连接云端服务器。

技术实现方案:

在 Android 设备上运行服务器,主要有两种方式:使用 JettyNanoHTTPD

使用 Jetty (功能更强大,适合复杂应用)

Jetty 是一个成熟、功能丰富的开源 Web 服务器和 Servlet 容器,你可以在 Android 应用中嵌入一个 Jetty 服务器。

优点

Android Java服务器如何搭建与开发?-图2
(图片来源网络,侵删)
  • 功能非常强大,支持完整的 Java EE 规范(如 Servlet, JSP, WebSocket)。
  • 稳定性和性能经过大规模验证。
  • 社区活跃,文档丰富。

缺点

  • 体积较大,会增加应用的 APK 大小。
  • 配置相对复杂。

简单示例代码 (创建一个返回 "Hello from Android Server!" 的 Jetty 服务器):

build.gradle 文件中添加 Jetty 依赖:

dependencies {
    implementation 'org.eclipse.jetty:jetty-server:9.4.44.v20250927'
    implementation 'org.eclipse.jetty:jetty-servlet:9.4.44.v20250927'
}

在 Activity 或 Service 中启动服务器:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyHttpServer {
    public void start() throws Exception {
        // 服务器监听端口
        int port = 8080;
        // 创建 Jetty Server 实例
        Server server = new Server(port);
        // 创建 Servlet 上下文处理器
        ServletContextHandler handler = new ServletContextHandler();
        handler.setContextPath("/"); // 设置根路径
        // 创建一个简单的 Servlet
        HttpServlet myServlet = new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
                resp.setContentType("text/plain");
                resp.getWriter().println("Hello from Android Server!");
            }
        };
        // 将 Servlet 添加到 handler
        handler.addServlet(new ServletHolder(myServlet), "/hello"); // 访问路径为 /hello
        // 将 handler 设置为 server 的处理器
        server.setHandler(handler);
        // 启动服务器
        server.start();
        System.out.println("Server started on port " + port);
    }
}

关键注意事项

  • 网络权限:必须在 AndroidManifest.xml 中声明网络权限。
    <uses-permission android:name="android.permission.INTERNET" />
  • 网络线程绝对不能在主线程(UI线程)中启动服务器,否则会引发 NetworkOnMainThreadException,你应该在 AsyncTask, Thread, ServiceRxJava 的后台线程中启动它。
  • 后台运行:如果要让服务器在应用关闭后继续运行,必须将其放在 Service 中,并考虑使用 ForegroundService 以防止系统在内存不足时杀死它。
  • 端口冲突:确保你选择的端口没有被其他应用占用。

使用 NanoHTTPD (轻量级,适合简单应用)

NanoHTTPD 是一个极简的 HTTP 服务器,非常适合在 Android 上快速搭建一个简单的服务器。

优点

  • 非常轻量,API 简单,易于上手。
  • 代码库小,对 APK 大小影响微乎其微。
  • 专门为 Android 和 Java 设计。

缺点

  • 功能相对有限,不适合构建复杂的业务逻辑。

简单示例代码 (使用 NanoHTTPD):

build.gradle 文件中添加依赖:

dependencies {
    implementation 'org.nanohttpd:nanohttpd:2.3.1'
}

创建服务器类:

import fi.iki.elonen.NanoHTTPD;
import java.io.IOException;
import java.util.Map;
public class NanoHttpdServer extends NanoHTTPD {
    public NanoHttpdServer() throws IOException {
        // 监听所有网络接口 (0.0.0.0) 和 8080 端口
        super(8080);
        start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
        System.out.println("Server started.");
    }
    @Override
    public Response serve(IHTTPSession session) {
        String uri = session.getUri();
        Map<String, String> params = session.getParms();
        if ("/hello".equals(uri)) {
            return newFixedLengthResponse("Hello from NanoHTTPD Server!");
        } else if ("/greet".equals(uri)) {
            String name = params.get("name");
            if (name != null) {
                return newFixedLengthResponse("Hello, " + name + "!");
            }
            return newFixedLengthResponse("Hello, stranger!");
        }
        return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "Not Found");
    }
}

启动方式和 Jetty 类似,也需要在后台线程中启动。


Android 客户端连接到一个由 Java 写的后台服务器

这是更常见、更主流的“服务器”概念,即你的 Android App 是客户端,它通过网络(通常是 HTTP/HTTPS)与一个部署在云端或远程服务器上的 Java 应用进行通信。

常见应用场景:

  • 用户登录/注册:App 将用户名密码发送到服务器进行验证。
  • 数据同步:App 从服务器获取最新数据(如新闻、社交媒体动态),或将用户创建的内容(如照片、文章)上传到服务器。
  • 在线游戏:App 与游戏服务器实时交互。

技术实现方案:

后端服务器技术栈

后端服务器可以用多种 Java 技术栈构建,常见的选择有:

  • Spring Boot:目前最流行、最强大的 Java 框架,极大地简化了创建独立、生产级 Spring 应用的过程,非常适合构建 RESTful API。
  • Java EE (Jakarta EE):传统的企业级标准,使用 JAX-RS (如 Jersey, RESTEasy) 来创建 REST 服务。
  • SparkJava:一个极简的微框架,灵感来自 Spark (Scala),非常适合快速构建小型的 API 服务。
  • Vert.x:一个用于构建响应式应用的工具包,性能极高,适合高并发场景。

Android 客户端如何连接服务器

Android 客户端通过发送网络请求来与服务器通信,现代 Android 开发推荐使用 Retrofit + OkHttp 的组合。

Retrofit:一个类型安全的 HTTP 客户端,它将 HTTP API 的接口转换为 Java 接口,让你可以用非常简洁、面向对象的方式调用网络接口。

OkHttp:一个高效的 HTTP 客户端,负责处理底层的网络连接、线程池、缓存等,Retrofit 底层默认就使用 OkHttp。

完整示例流程:

第一步:后端服务器 (使用 Spring Boot)

创建一个简单的 Spring Boot 控制器,提供一个 /api/users/{id} 的 GET 接口。

// Spring Boot Controller
@RestController
@RequestMapping("/api")
public class UserController {
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // 模拟从数据库查询
        if (id == 1) {
            return new User(1L, "John Doe", "john.doe@example.com");
        }
        throw new UserNotFoundException("User with id " + id + " not found");
    }
}
// User 模型类
public class User {
    private Long id;
    private String name;
    private String email;
    // 构造方法, Getters, Setters...
}

第二步:Android 客户端 (使用 Retrofit)

  1. 添加依赖 (build.gradle):

    // Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 用于 JSON 解析
    // OkHttp (Retrofit 会自动引入,但有时需要单独配置)
    implementation 'com.squareup.okhttp3:okhttp:4.9.3'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3' // 用于打印日志
  2. 定义 API 接口:

    import retrofit2.Call;
    import retrofit2.http.GET;
    import retrofit2.http.Path;
    public interface UserService {
        @GET("users/{id}")
        Call<User> getUser(@Path("id") long userId);
    }
  3. 创建 Retrofit 实例并发起请求:

    import retrofit2.Retrofit;
    import retrofit2.converter.gson.GsonConverterFactory;
    public class ApiClient {
        private static final String BASE_URL = "http://your-server-ip:8080/"; // 替换为你的服务器地址
        private static Retrofit retrofit = null;
        public static Retrofit getClient() {
            if (retrofit == null) {
                retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
            }
            return retrofit;
        }
    }
  4. 在 Activity 或 ViewModel 中调用:

    // 在一个后台线程中执行,例如使用 ViewModel + Coroutines 或 RxJava
    UserService service = ApiClient.getClient().create(UserService.class);
    Call<User> call = service.getUser(1);
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            if (response.isSuccessful()) {
                // 请求成功
                User user = response.body();
                Log.d("ApiSuccess", "User: " + user.getName());
                // 更新 UI...
            } else {
                // 服务器返回了错误码 (如 404, 500)
                Log.e("ApiError", "Error: " + response.code());
            }
        }
        @Override
        public void onFailure(Call<User> call, Throwable t) {
            // 网络错误或其他异常
            Log.e("ApiFailure", "Failure: " + t.getMessage());
        }
    });

总结与建议

场景 推荐技术 说明
在 Android 设备上运行服务器 (局域网内) NanoHTTPD (轻量) 或 Jetty (功能强) 适用于设备间通信、文件共享等,注意网络权限和后台运行问题。
Android App 连接远程服务器 (最常见) Android 客户端: Retrofit + OkHttp
Java 服务器: Spring Boot
这是现代移动应用开发的标准模式,Spring Boot 是构建后端 API 的首选,Retrofit 是 Android 调用 API 的首选。

对于初学者,我强烈建议你从 “含义二” 开始学习,因为它更贴近实际的产品开发流程,先掌握如何用 Retrofit 调用一个现成的 API(GitHub API 或天气 API),然后再去学习如何用 Spring Boot 自己搭建一个简单的 API 服务器。

如果你确实有在手机上运行服务器的需求,可以从 NanoHTTPD 开始,因为它足够简单,能让你快速理解服务器的基本工作原理。

分享:
扫描分享到社交APP
上一篇
下一篇