通过Java套接字持续发送数据

3
什么是通过Java套接字连续从服务器向客户端发送数据(float数组)的最佳方式?例如,我有一个服务器每1ms生成一次float数据,并希望将这些数据发送给客户端。我的计划是将此过程放入一个线程(服务器端),并将其连续发送到客户端。是否可以通过Java套接字实现这一点?或者应该先将数据写入文件然后再发送给客户端呢?
谢谢!
4个回答

5
通过套接字进行这项操作应该没有问题。基本上,您需要在服务器端设置一个线程,在提供新的数据集时发送数据。然后,在客户端上设置一个线程,不断监听套接字,读取并解压可用的数据,将其发布到某个位置以供客户端的处理代码使用,然后返回轮询/休眠周期,直到服务器发送更多数据。只需确保在客户端上提供一种方法,以便在套接字关闭(服务器关闭、网络故障等)时终止监听器线程。

3
使用简单的套接字编程,这并不是什么问题:
  • 在服务器和客户端之间打开TCP连接
  • 使用连接的 InputStreamOutputStream 发送数据
  • 在出现任何错误/断开连接的情况下关闭连接
请注意,这个解决方案并不是很可扩展的。如果需要进行扩展,您将需要使用非阻塞IO(以便您的服务器不会被所有打开的连接和运行的线程所卡住)。

1
只要客户端保持连接,您就可以发送数据。
如果您正在使用http,则每个请求后连接都会关闭,除非您使用类似Comet的东西。您可以在维基百科上查看,但是这篇文章可能对Java有帮助: http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp-test.html 更新 如果您正在使用常规基于套接字的服务器和设置为具有恒定连接的客户端,则只要连接处于打开状态,您就可以随时发送数据。它只会被连接的人或网络问题关闭。
但是,如果您正在使用http,则规则会有所改变,这就是第二段的作用。

嗯... HTTP 的默认行为不是“关闭连接”,这是浏览器的行为。 - jldupont
每个请求都是一个telnet连接,据我理解,当其余部分被接收时,它似乎会被Web服务器关闭。 - James Black
但是从问题中并没有明确说明我们正在处理一个浏览器/ Web 服务器对,是吗? - jldupont
这就是为什么我开始使用“是”的原因,只要连接是打开的,但是,如果他正在使用http,则我的“是”并不完全正确。 - James Black

0
最简单的方法是在客户端/服务器端使用ObjectInputStream/ObjectOutputStream,然后客户端尝试从流中读取。如果没有新数据,客户端将等待,一旦服务器发送新数组,客户端就会读取它,处理它,然后再次开始等待。根据客户端的操作,将读取放入一个额外的线程中,并将数组交给实际处理方法可能是明智的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接