java - 如何将 JavaSE 客户端连接到 JavaEE 服务器并发送可序列化对象?

标签 java sockets jakarta-ee serialization

我正在尝试使用 JavaEE 服务器和 JavaSE 客户端(可能还有在 Android 和 IOS 上运行的客户端)构建应用程序。我希望客户端能够将可序列化的对象或类似的对象发送到服务器。然后服务器应该执行一些操作并向客户端发送响应。我不知道从哪里开始,但我试图在下面概述我的意图。

我并不是在寻找完整的代码来实现这一点,而是寻找一些指针和确认(或反驳)我是否走在正确的轨道上。也许是一个起点:)

我有一个可序列化的类,如下所示:

public class TestMessage implements Serializable {
    public String str;
}

在客户端我想做这样的事情:

try {
    InetAddress address = InetAddress.getByName(
        new URL("http://127.0.0.1/hello").getHost());
    Socket connection = new Socket(address, 46588);
    connection.setSoTimeout(5000);
    try (ObjectOutputStream outgoing = new ObjectOutputStream(
         new BufferedOutputStream(connection.getOutputStream()
         ))) {
            TestMessage test = new TestMessage();
            test.str = "Hello World";
            outgoing.writeObject(test);
            outgoing.flush();
        }
    } catch (UnknownHostException ex) {
        System.out.println("Unknown Host...");
    } catch (IOException ex) {
        System.out.println("i/o exception...");
    }

我想我可以使用 @ServerEndpoint Bean,但这会创建一个 WebSocket,我似乎无法使用套接字连接到它。我怀疑我需要在套接字中实现 HTTP 内容,但是如何发送我的对象呢?

我还考虑使用 @Startup Bean 并打开 ServerSocket,但似乎我必须自己处理线程,这有点违背了使用 JavaEE 的目的。归结起来就是:

  • 如何启动多个 JavaSE 客户端可以同时连接的 JavaEE Bean?
  • 如何在 JavaEE 服务器和 JavaSE 客户端之间来回发送可序列化对象或类似的对象(例如 JSON)?

最佳答案

不确定您是否尝试过使用 REST 服务来解决您的问题,因此我建议创建 REST 服务。网上有一些很棒的资源。这是一个链接供您引用。

https://spring.io/guides/gs/rest-service/

这样做,您将能够轻松实现以下目标。

  1. 利用 HTTP 使您的 iOS 和 Android 与服务器上的应用程序进行交互。 这不仅仅意味着您仅将 HTTP 用于传输层请求,而且您将能够使用该协议(protocol)进行全面的内容协商,并且您的服务器将控制协商

  2. 服务器上的资源将根据您的选择灵活表示。

与您建议的方法相比,这种方法还有其他好处,但我将其留给您探索。我在下面列出了一些链接供您引用。

REST 服务教程 https://www.tutorialspoint.com/restful/index.htm

帮助您避免将此方法与 SOAP 进行比较 SOAP vs REST (differences)

RESTful Web 服务的多层架构 https://www.ibm.com/developerworks/library/wa-aj-multitier/

关于java - 如何将 JavaSE 客户端连接到 JavaEE 服务器并发送可序列化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41313144/

相关文章:

java - 为什么 Intellij IDEA 不接收我的 java JDK

java - 使用 JaCoCo 在 Travis CI 中执行测试时出错

python - 使用套接字编程在python中创建消息系统

javascript - jQuery 表单验证在 JSP 中不起作用

java - Base64 编码和解码不会给出相同的结果

java - 基于注解的JMX

java - 如何更新在 While 循环中显示图像的 JLabel?

php - 尝试使用 C 向本地服务器发送 POST 请求

jakarta-ee - CustomSQLUtil 在使用 Liferay 7 进行查询检索期间获取空值

java - 单个 Web 应用程序有多少个 Web.xml