如何将JavaSE客户端连接到JavaEE服务器并发送Serializable对象?

时间:2016-12-24 12:11:54

标签: java sockets java-ee serialization

我正在尝试使用JavaSE服务器和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的对象?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

  2. 您在服务器上的资源可以灵活地表示您的选择。

  3. 这种方法对您建议的方法有其他好处,但我可以留待您探索。我在下面列出了一些链接供您参考。

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

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

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