Java 循环屏障再利用?
我目前正在尝试实现一个与机器通信的应用程序,其基本工作原理如下:Java 循环屏障再利用?,java,multithreading,sockets,concurrency,cyclicbarrier,Java,Multithreading,Sockets,Concurrency,Cyclicbarrier,我目前正在尝试实现一个与机器通信的应用程序,其基本工作原理如下: 程序向服务器发送消息(在本例中,为文件的前255字节) 机器以“消息成功接收”或“错误”响应 接收消息“响应” 然后,程序必须根据机器的响应决定是否发送下一条消息(下一个255字节)(上一条消息出错,必须重新启动) 依此类推程序需要发送的每条消息(取决于文件的大小) 因此,我们考虑使用一个线程进行发送,另一个线程进行接收,因为我们有一个api来注册一个类作为从机器接收消息的类(只需实现一个接口),并且向机器发送消息的方法不是阻
- 程序向服务器发送消息(在本例中,为文件的前255字节)
- 机器以“消息成功接收”或“错误”响应 接收消息“响应”
- 然后,程序必须根据机器的响应决定是否发送下一条消息(下一个255字节)(上一条消息出错,必须重新启动)
- 依此类推程序需要发送的每条消息(取决于文件的大小)
- 如何使屏障可重复使用?那是自动的还是自动的 要手工做吗
- 程序挂起是因为我丢失了套接字(或屏障代码)
Socket sender = new Socket("localhost", 8080);
PrintWriter pw = new PrintWriter(sender.getOutputStream(), true);
必须在for循环内移动。(当然,要注意释放所有资源)
或者
将接收器修复为从第一个连接读取数据,而不是等待第二个数据包的新连接。Nice…:)现在它可以工作了(程序根本不挂起,等待消息)。但是,当您说“修复接收器以从第一个连接读取数据”时,您的意思是什么?即移动“套接字响应=ss.accept();BufferedReader br=新的BufferedReader(新的InputStreamReader(response.getInputStream());“离开while循环,并继续从该连接读取下一行数据。由于发送和接收是顺序进行的,所以所有工作都可以在单个线程中完成。两个线程是不必要的复杂化和资源浪费。我也这么认为,但我们在尝试将其顺序化时遇到了问题,因为标记为接收消息的对象通过硬件中断收到传入消息的通知,对此我们没有控制权,发生的速度甚至比程序等待机器响应的速度还要快,因此有时会丢失消息;在我们的例子中有些不可接受的东西,因为这些文件实际上是智能卡芯片的操作系统。你在说什么硬件中断?您显示的文本仅使用标准套接字和服务器套接字用法。然后,在测试中,客户端线程和服务器线程都使用单个屏障。事实上,客户机和服务器运行在不同的进程中,无法访问同一个对象。这就是为什么我说我不使用它们与机器对话,它们在那里是为了查看屏障是如何工作的;我认为它们足以制作一个简单的握手场景,从技术上讲,机器不是服务器,所有程序(发送/接收线程)都在一台计算机上运行;机器只响应以这种/那种方式发送给它的内容,这取决于它的内部协议。中断来自用于与机器通信的PCI卡,该卡通过我们可以通过java库与之交互的专有驱动程序进行处理。
Waiting message...
Sending message:
Received: Message!
done.
Waiting message...
Sending message:
Socket sender = new Socket("localhost", 8080);
PrintWriter pw = new PrintWriter(sender.getOutputStream(), true);