13

我需要编写一个小型服务器来处理来自 Android 应用程序的请求。(用户向服务器发送一个数字,服务器对从每个用户收到的数字进行一些数学运算 - 比如说平均值 - 并返回它)。

我刚刚从 Oracle ( http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html ) 阅读了这个简单的介绍。

它解释了如何让服务器监听特定的门。普通java,不需要特殊应用程序(如Tomcat)。

我知道人们通常使用“servlet”(使用 Tomcat)来完成这种事情。这是为什么?有什么优势?我不能像那个简单教程中描述的那样编写一个示例服务器,并让它始终在计算机上运行吗?

4

4 回答 4

15

使用套接字非常简单。首先。

你创建你的服务器类,你让它绑定到一个端口,然后你就走了。

评论中涵盖的第一个障碍是多线程。但是一个简单的生产者/消费者模式将很快为您解决这个问题。

您将遇到的下一个问题是协议

  • 谁先说话?

  • 你如何回应?

  • 如何处理无效请求?

  • 如果流在请求期间崩溃会发生什么?

  • 您是否为每个请求打开一个新套接字,或者客户端是否保留一个套接字并写入多个请求?

  • 也许你想要某种非阻塞 IO?

这就是 HTTP 的用武之地,它是一种通过 TCP/IP 进行通信的协议(实际上可以通过任何东西,你可以使用纸片和自行车)。它定义了上述所有问题(以及更多问题)的答案。

因此,您运行一个网络服务器(tomcat、glassfish),它处理原始套接字并发送正确的信息。

servlet 是一种抽象,当 Tomcat 有一个连接并且它已经协商了压缩、加密等时,它会将请求传递给 servlet。

servlet 不必担心原始套接字,它读取请求并写入响应。

值得指出的是,HTTP 并不是唯一的协议,它只是碰巧用于网络浏览的一种协议。网络服务器使用的也是如此。

于 2013-04-18T14:55:23.630 回答
10

您不需要 servlet。

Servlet 很有帮助,因为它们为您管理套接字处理,但缺点是您需要一个容器(例如 Tomcat)来运行您的 servlet。你可能想看看Netty,它真的是为做你所说的工作而构建的。

于 2013-04-18T14:50:44.620 回答
4

Servlet 是 Java 中处理 HTTP 协议的标准方式。

如果您想使用 HTTP 进行客户端-服务器通信,并且想在服务器端使用 Java,那么您应该使用 servlet。

Servlet 是使用 Java 在 Internet 中进行通信的一种简单而有效的解决方案。根据您的需要,rancidfishbreath 建议的 Netty 是一个有效的替代方案,但我推荐使用 Tomcat 的 servlet,因为它是一个更简单的解决方案。必须使用 Tomcat 不是问题:它轻巧且免费。

由于 bmorris591 已经解释的原因,放弃使用原始套接字的想法。

于 2013-04-18T15:04:53.587 回答
0

您可能希望将 Java 以外的其他东西视为服务器端解决方案。也许Node.jsPHP甚至Ruby on Rails可能是更好的、没有花里胡哨的选择。我可能会列出 100 多个选项(Python、Django 等,等等),它们比尝试学习 Java 和 Servlet 以及随之而来的所有东西要简单得多。您不一定需要让 Java 应用程序与 Java 应用程序对话,并且有很多选项可以让简单的 HTTP 服务器运行不需要大量学习曲线的自定义解决方案。

于 2013-04-18T18:42:35.490 回答