我已经用Java编程了一段时间,但之前从未处理过线程。在我的一个课程中,我们了解了易于使用但功能非常强大的Socket
和ServerSocket
课程。我们制作了可以在同一台机器上相互通信的程序(使用“localhost”)。有两个类,一个是Server.java和一个Client.java,但它们只能以回合制的方式相互通信。
我想将socket.accept()
方法放在一个新线程上,这样服务器和客户端程序都可以在socket.accept()
等待新消息时发送消息。
到目前为止,我已经完成了线程,但我无法想到将ServerSocket / Socket对象放在何处。如果我将它们放在等待传入消息的线程中,我就不能将该对象用于传出消息。如果我直接将ServerSocket / Socket对象放在Server.java/Client.java文件中,我就不能(或者我只是不知道如何)将对象传递给线程,而不创建它的副本。 / p>
关于我应该如何构建这个程序的任何建议?
谢谢, 德里克
答案 0 :(得分:1)
我想说运行此应用程序的最佳方式是两个独立的进程/虚拟机,而不是两个线程。虽然您目前在同一台(虚拟)机器上运行它们,但即时消息传递和套接字的全部要点是允许不同进程之间的通信,这些进程可能位于不同的计算机上。您已经拥有这两个类 - 只需确保它们都有main()
个方法,以便它们可以自行运行。
另外,如果你想要全双工通信,你需要每个进程有两个线程 - 一个等待用户输入并发送到另一端,另一个等待来自另一端的消息并将它们呈现给用户。虽然您可以设置一个半双工系统,其中令牌在单个套接字上前后传递,但如果您为每端设置一个传入套接字和一个传出套接字,您可能会发现它更容易。
如果你想从两端进行全双工通信,我认为这不是真正的客户/服务器关系。如果双方能够平等地相互交谈,那么他们真的更加同行。无论如何都有一个“服务器”类来监听传入的消息,一个“客户端”类发送传出的消息,但每个机器上都有一个。这些映射与发送和接收线程非常接近。