如何在安卓设备上实现一个HTTP服务器

9
我在同一个局域网下使用Wi-Fi有两个安卓应用程序:
  1. 应用程序(A)在8033端口上打开监听套接字
  2. 应用程序(B)使用HttpClient访问端口8033上的(A)
如何使(A)能够在(B)上执行POST和GET请求? (A)用于访问(B)的URL是什么样子?
谢谢大家。

@Jonas的问题不在于客户端是否能够与服务器通信,而在于HttpClient是否能够与他的其他应用程序正在侦听的服务器套接字进行通信。 - Aleks G
4个回答

13
你可能会混淆两个不同级别的网络通信。

第4层: 两个套接字之间的TCP连接
这是两侧之间的逻辑管道(可以是单个(两个进程?)或两台不同的计算机), 只有处理数据的连接在此级别处理

第7层: 浏览器 / 应用服务器使用特定的通信“语言”交换高级数据(文件,图像,音频等),并在此级别上处理信息。

您的问题是要打开一个Listening Socket(第4层)和一个使用HTTP协议(第7层)与其通信的客户端。因此,您错过了处理从套接字监听方到处理HTTP协议的中间步骤。
也许Java Web服务器实现可以帮助您。


好的,谢谢。但是我在哪里可以找到Android和TJWS的工作示例呢?我看了一下网址,但是我对Java完全不熟悉,所以如果我能得到一些代码,那么理解起来会非常容易。 - KhanZeeshan
微型Java Web服务器实现了JEE(Java Enterprise Edition)定义的标准servlet容器:因此,我的建议是1)查找“如何在Android项目中实现第三方库/ jar” 2)学习更多关于Java Standard Edition(经典版)和Enterprise Edition(通常用于Java应用服务器)的知识,例如参考 http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets.html , http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-First-Servlets.html。 - Emmanuel Devaux
我遇到了这个链接:“http://www.androiddevblog.net/android/a-bare-minimum-web-server-for-android-platform”,它正好做我想做的事。你同意吗? - KhanZeeshan
我想这是制作轻量级HTTP服务器的好方法。你应该试一试。我会相应地更新我的答案。祝你好运。 - Emmanuel Devaux

2

请查看在Github上提供的AndServer项目。它是一个适用于Android平台的Web服务器和Web框架。它提供了类似于SpringMVC的注释。

@RestController
@RequestMapping(path = "/user")
public class UserController {

    @PostMapping("/login")
    public String login(@RequestParam("account") String account,
                        @RequestParam("password") String password) {

        ...
        return "Successful.";
    }

    @GetMapping(path = "/{userId}")
    public User info(@PathVariable("userId") String userId,
                     @QueryParam("fields") String fields) {

        User user = findUserById(userId, fields);
        ...

        return user;
    }

    @PutMapping(path = "/{userId}")
    public void modify(@PathVariable("userId") String userId
                       @RequestParam("age") int age) {
        ...
    }
}

简单部署

Server server = AndServer.webServer(context)
    .port(8080)
    .timeout(10, TimeUnit.SECONDS)
    .build();

// startup the server.
server.startup();

...

// shutdown the server.
server.shutdown();

1
我正在寻找同样的解决方案,并发现了NanoHTTPD - 一个非常简单的HTTP请求处理服务器类。您可以在https://github.com/NanoHttpd找到源代码和非常易于理解的示例。

1

仅监听一个端口并接受套接字连接是不足以将数据返回给HttpClient的。 套接字实际上提供了一个物理管道,但对于沿着该管道流动的数据格式一无所知。 如果您打算使用HttpClient,则需要让服务器应用程序了解HTTP协议(或至少了解其基本子集)。

如果您只需要两个进程以某种方式通信,那么最好让服务器应用程序成为服务,然后让客户端应用程序查询此服务以获取所需数据。


如何让服务器套接字理解HTTP协议?抱歉,我忘记说客户端会在另一个Android设备上,而服务器会在另一个设备上。 - KhanZeeshan
“物理管道”可能是一种限制性观点……在单个设备上,您可以拥有一个监听套接字和一个客户端,而不需要任何物理链接。 - Emmanuel Devaux
我找到了许多在Java中查询Web服务器和正常的服务器与客户端套接字通信的HTTPClient示例,但我找不到任何实现HTTP协议等内容的服务器套接字示例。 - KhanZeeshan
你不会找到很多关于服务器套接字理解HTTP协议的例子,因为它相当复杂。大约12-13年前,我不得不在Java中实现HTTP服务器 - 仅基本的HTTP请求解析就超过了1000行代码。除非你很好地理解HTTP协议(从你的问题来看,你并不理解),否则我强烈不建议你这样做。最后,通过套接字让一个设备与另一个设备通信,在我看来是一种有点奇怪的方法。 - Aleks G
你说得对,我对协议不是很了解,我提出这个问题的主要原因是因为我正在Android上创建一个Web服务器,我已经看过iJetty和TJWS,但由于我完全不懂Java,所以无法理解它们,所以我想如果可以让两个不同的东西相互通信,我就怀疑它是否有效,这就是为什么我在问题中说“这可能很愚蠢”的原因。谢谢你的帮助。 - KhanZeeshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接