【问题标题】:How does one establish multiple IO streams between a client and server?如何在客户端和服务器之间建立多个 IO 流?
【发布时间】:2011-12-09 10:02:01
【问题描述】:

我正在用 Java 创建一个客户端/服务器对,目前仅支持通过 PrintWriters 和 BufferedReaders 围绕服务器和客户端的 IO 流进行交错文本通信。

我想实现一个函数,该函数使用 Image[Input/Output]Stream 以设定的时间间隔将 BufferedImage 从服务器发送到客户端。

问题是我希望在单独的线程中发送/接收 BufferedImages,以便客户端/服务器仍然可以发送/接收文本命令。

我可以创建多个流或套接字吗?如果是这样,那是最好的方法吗?

【问题讨论】:

  • 您可以创建多个套接字,只需以与创建第一个相同的方式打开其他套接字(您不能将多个套接字打开到相同的 ip/端口组合,但是请选择不同的端口) .
  • 谢谢。我想我可能不得不朝那个方向走。只有1个端口就没有办法吗?我可能想实现其他应该同时运行的功能......应用程序打开这么多端口是否正常?
  • 应用程序打开许多端口是很正常的,但如果你坚持使用一个,显然对最终用户更好。唯一的其他选择是在您的单个套接字上多路复用数据,如 Jarrod 所述。
  • 不要通过网络使用 PrintWriter。它吞下您需要了解的异常情况。在这种情况下,您可以使用 BufferedWriter。

标签: java sockets io


【解决方案1】:

使用单个套接字实现此目的的一种方法是将各个流多路复用到连接到套接字的单个字节流上,BEEP 是一个很好的实现。

【讨论】:

    【解决方案2】:

    是的,您可以根据需要创建任意数量的线程和套接字。请注意:不要忘记关闭套接字并控制线程创建过程:过多的线程不会提高您的性能,甚至可能导致您的系统停止。

    也许你应该使用线程池。但这取决于您的应用程序。看看java.util.concurrency 包。

    如果您有更具体的问题,请不要犹豫。

    【讨论】:

      【解决方案3】:

      一个多路复用流应该维护多个缓冲区。

      多路复用流应该为读取器提供它自己的缓冲区。多路复用流应该在写入操作期间增加每个缓冲区,并在读取操作期间缩小所需的缓冲区。

      单个倒带缓冲区更难管理,因为读取器需要有状态,但通常更具可扩展性,如果不是性能的话。

      使用的具体连接协议是一个实现细节。网络套接字只是缓冲区,可用于实现多路复用流。在这种情况下,网络成为瓶颈。

      【讨论】:

        猜你喜欢
        • 2011-05-20
        • 2012-04-24
        • 2012-09-15
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多