Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java线程模拟客户机-服务器应用程序?_Java_Multithreading - Fatal编程技术网

如何使用Java线程模拟客户机-服务器应用程序?

如何使用Java线程模拟客户机-服务器应用程序?,java,multithreading,Java,Multithreading,对于这项学校作业,我需要使用Java线程模拟一个客户机-服务器类型的应用程序(不需要套接字等)。我该怎么做呢 我需要一种方法来启动服务器并等待客户端调用它,然后它应该返回响应。我心目中的“API”是这样的: server.start() client1.connect(server) client2.connect(server) x = client1.getData() y = client2.getData() success1 = client1.sendData(1) succes

对于这项学校作业,我需要使用Java线程模拟一个客户机-服务器类型的应用程序(不需要套接字等)。我该怎么做呢

我需要一种方法来启动服务器并等待客户端调用它,然后它应该返回响应。我心目中的“API”是这样的:

server.start()
client1.connect(server)
client2.connect(server)

x = client1.getData()
y = client2.getData()

success1 = client1.sendData(1)
success2 = client2.sendData(2)

server | client.run方法看起来如何?假设我现在可以硬编码方法调用

从您提供的描述中,我可以建议您写以下内容

1) 有一个队列,所有客户端都可以在其中放置消息

2) 运行在无限循环(如while(true))中的服务器等待已放入队列的新消息,如果找到新消息,则对其进行处理并将其标记为已处理

3) 客户端线程的任务是创建消息并将它们放入队列中。以及通知服务器新消息已添加到队列中,以便服务器可以知道新消息已到达以进行处理

为了让这个程序正常工作,我认为您需要学习线程的notify、notifyAll()和wait()方法。因此,基本上没有套接字,您需要的是“线程间通信”。链接可以帮助你


希望这有帮助。

我建议使用以下方法:
1.具有用于阻塞队列的“服务器”代码-
阻塞队列是一种同步的数据结构,让从中读取数据的线程(“使用者”线程)等待,直到队列中有数据要读取
“生产者”线程是在队列上“推送”数据的线程
我建议您使用其中一种实现
我还建议您阅读更多关于“模式”的内容。

阻塞队列还消除了“忙等待”的需要,这在多线程编程中是不推荐的。

“忙等待”“不建议在多线程中使用。请参阅我关于阻塞队列的回答。还有其他方法来处理这个问题。线程可以等待同步对象,该对象将由发送数据的线程发出信号。@zaske:那么,您是想说使用者和生产者都将对集合拥有同步锁,并且当存在消息时,使用者将使用该对象并将其从队列中删除吗?这似乎是个好办法。是的,若需求如此简单,那个么它可以节省使用wait、notify和notifyall的开销。是的,但我建议使用“已经编写”的类。不需要“重新发明轮子”,当然,除非他不允许使用java util并发。但即使在这种情况下,他也会发现他可以使用的internet上的阻塞队列实现。@zaske:是的,那会更好。我也想到了这一点。服务器如何确定将数据返回到哪个客户机/生产者?我是否有一个接收对象(producer、functionToCall、args)的阻塞队列?@JiewMeng-对于这个问题,您可以有一个阻塞队列,其中客户端将是使用者,服务器将是生产者。您是指一对队列,其中1将服务器作为使用者(当客户端请求数据时),反之亦然?否则服务器如何知道客户端何时调用?嗯。。。我可能有很多客户。。。那么,每个客户端需要1个队列吗?否则,我需要检查一下这个回答是否适合我