来自一个套接字的许多 io 流

many io stream from one socket

我能否并行连接服务器套接字和客户端套接字的许多独立 I/O 流,以便每对 I/O 流可以同时发送不同的数据?

如何在不增加服务器和客户端之间的套接字数量的情况下在 java 中实现这样的连接?

总是有一种输入流和一种输出流,因此您无法添加更多流。

然而,正如sje397评论的那样,你可以使用相同的流来发送"different"数据,你只需要想出一种方法来区分接收端的通道,这样它就可以重建数据适当地。这是一个协议设计问题。

编辑: 在您的示例中,您可以有一个带有 header 的数据包结构,它告诉数据包的类型(或通道)、数据的长度以及文件数据包的一些附加信息(如果需要)。假设长度字段是一个字节,那么您的最大数据包大小(对于字符串数据包)将是 1 + 1 + 255 = 257 bytes.

当服务器读取字节时,它会检查数据包类型的第一个字节。确定是String包后,会先读取长度,再读取payload。然后重复这个过程。

对于文件数据,很可能需要额外的 header 信息,否则 non-String 数据包将只是一堆字节。

这意味着您的协议将变成基于数据包的,因此您必须一次写入一个数据包。假设一个数据包的最大大小为64K,那么您就可以通过以下方式发送数据(假设它是一个网络管道):

Client -> 257(S) -> 64K(D) -> 257(S) -> 64K(D) -> 257(S) -> Server 允许您在单个网络连接中交错两种不同类型的数据。

假设您希望快速回复控制台输入,我建议使用两个套接字流 - 一个用于文件数据,另一个用于用户输入。您可以使用 ObjectInputStreamObjectOutputStreams 来简化您的协议。只需为您的协议创建一个 class 使其可序列化并将其与套接字流一起使用。