【问题标题】:(New to threading) Best way to structure an instant messaging application?(线程新手)构建即时消息应用程序的最佳方式?
【发布时间】:2011-03-07 15:32:15
【问题描述】:

我用 Java 编程已经有一段时间了,但以前从未处理过线程。在我的一堂课中,我们了解了易于使用但功能非常强大的 SocketServerSocket 类。我们制作了可以在同一台机器上相互通信的程序(使用“localhost”)。有两个类,一个 Server.java 和一个 Client.java,但它们只能以回合制的方式相互交谈。

我想将socket.accept() 方法放在一个新线程上,这样服务器和客户端程序都可以在socket.accept() 等待新消息时发送消息。

到目前为止,我在线程方面做得很好,但我想不出将 ServerSocket/Socket 对象放在哪里。如果我把它们放在等待传入消息的线程中,我就不能将该对象用于传出消息。如果我将 ServerSocket/Socket 对象直接放在 Server.java/Client.java 文件中,我不能(或者我只是不知道如何)将对象传递给线程,而不创建它的副本。

对我应该如何构建这个程序有什么建议吗?

谢谢, 德里克

【问题讨论】:

    标签: java multithreading sockets


    【解决方案1】:

    我会说运行此应用程序的最佳方式是作为两个独立的进程/虚拟机,而不是两个线程。尽管您目前在同一台(虚拟)机器上运行它们,但即时消息传递和套接字的全部意义在于允许不同进程之间的通信,这些进程可能位于不同的机器上。您已经有了这两个类 - 只需确保它们都有 main() 方法,以便它们可以自己运行。

    另外,如果你想要全双工通信,你需要每个进程有两个线程 - 一个等待用户的输入并将其发送到另一端,另一个等待来自另一端的消息并将它们呈现给用户。虽然您可以设置一个半双工系统,其中令牌在单个套接字上来回传递,但如果您设置一个传入套接字和每端一个传出套接字,您可能会发现它会容易得多。

    如果你想从两端进行全双工通信,我认为这不是真正的客户端/服务器关系。如果双方能够平等地交谈,他们真的是更多的同行。无论如何都有一个“服务器”类来监听传入的消息,以及一个“客户端”类来发送传出的消息,但在每台机器上都有一个。这些映射非常接近发送和接收线程。

    【讨论】:

    • Java Socket 是全双工的——它有一个 InputStream 和一个 OutputStream 连接到另一端。
    • 那么我是正确的。我一直更喜欢更高级别的框架,比如 RMI。
    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多