我可以并行连接服务器套接字和客户端套接字的多个独立I/O流,使每对I/O流可以同时发送不同的数据吗?
如何在java中实现这样的连接而不增加服务器和客户端之间的套接字数量?
总是一个流用于输入,一个流用于输出,所以你不能添加更多的流。
然而,正如sje397所评论的那样,您可以使用相同的流发送"不同"的数据,您只需要想出一种方法来区分接收端的通道,这样它就可以正确地重构数据。这是一个协议设计问题。
编辑:在您的示例中,您可以有一个带有头的包结构,它告诉包的类型(或通道)、数据的长度以及文件包的一些额外信息(如果需要的话)。让我们假设长度字段是单个字节,那么您的最大数据包大小(对于字符串数据包)将是1 + 1 + 255 = 257 bytes
。
当服务器读取字节时,它将检查第一个字节的数据包类型。在确定它是一个String包之后,它将读取长度,然后读取有效负载。然后重复这个过程。
对于文件数据,很可能需要额外的头信息,否则非字符串数据包将只是一堆字节。
这意味着你的协议将成为基于包的,所以你必须一次写一个包的数据。假设数据包的最大大小为64K,那么您将能够以以下方式发送数据(想象它是一个网络管道):
Client -> 257(S) -> 64K(D) -> 257(S) -> 64K(D) -> 257(S) -> Server
允许您在单个网络连接中交织两种不同类型的数据
假设您想要控制台输入的快速响应,我建议使用两个套接字流—一个用于文件数据,另一个用于用户输入。您可以使用ObjectInputStream
和ObjectOutputStreams
来简化您的协议。只需为您的协议创建一个类,使其可序列化,并将其用于套接字流。