许多io来自一个插槽

时间:2015-08-29 07:35:54

标签: java sockets stream-socket-client

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

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

2 个答案:

答案 0 :(得分:0)

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

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

编辑: 在您的示例中,您可以使用带有标头的数据包结构,该标头可以告知数据包的类型(或通道),数据的长度以及文件数据包中的一些其他信息(如果需要)。假设长度字段是单个字节,因此您的最大数据包大小(对于String数据包)将为1 + 1 + 255 = 257 bytes

当服务器读取字节时,它将检查第一个字节的数据包类型。在确定它是一个String数据包之后,它将读取长度,然后读取有效负载。然后这个过程重复进行。

对于文件数据,最有可能需要额外的头信息,否则非String包只是一堆字节。

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

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

答案 1 :(得分:0)

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