8

我在 WIFI 提供的同一 LAN 上有两个 android 应用程序:

  1. 在端口 8033 上打开侦听套接字的应用程序 (A)
  2. 使用 HttpClient 在端口 8033 上访问 (A) 的应用 (B)

如何使 (A) 可以在 (B) 上执行 POST 和 GET 请求?
(A) 用来访问 (B) 的 URL 是什么样的?

谢谢大家。

4

4 回答 4

12

您可能会混淆两种不同级别的网络通信。

级别 4:两个套接字之间的 TCP 连接。
到一侧(可能是单个(两个进程?)或两台不同的计算机)之间的逻辑管道仅在此级别处理连接处理数据

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

您的问题是要打开一个侦听套接字(级别 4)和一个使用 HTTP 协议(​​级别 7)与之交谈的客户端。

所以你错过了填补套接字侦听端处理HTTP协议的空白
可能是一个java Web服务器实现可能会对你有所帮助。

于 2011-09-01T09:46:33.390 回答
1

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

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

于 2011-09-01T09:23:29.907 回答
1

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

于 2014-12-03T00:44:41.250 回答
0

查看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();
于 2021-12-04T10:39:45.140 回答