当前位置: 首页 > 知识库问答 >
问题:

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

乐正浩博
2023-03-14

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

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

共有2个答案

卫博学
2023-03-14

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

葛阳华
2023-03-14

总是有一个流用于输入,一个流用于输出,所以不能添加更多流。

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

编辑:在您的示例中,您可以有一个带有标头的数据包结构,标头告诉数据包的类型(或通道)、数据的长度以及如果需要的话为文件数据包提供一些附加信息。让我们假设长度字段是一个字节,因此您的最大数据包大小(对于String数据包)将是1 1 255 = 257bytes

当服务器读取字节时,它会检查数据包的类型的第一个字节。确定它是String数据包后,它将读取长度,然后读取有效负载。然后这个html" target="_blank">过程重复自己。

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

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

客户端-

 类似资料:
  • 我刚刚开始使用Sockets,对于我当前的项目,我需要能够从客户端控制我的程序,但是如果我的项目合作伙伴想同时使用他的客户端,服务器不会向他发送“您已连接”消息,如连接类所示。所以我假设服务器不同时接受多个客户端。我尝试过使用类Connection的Thread,但这也不会向第二个客户端发送消息“您已连接”。我在这里做错了什么? 这是我用来同时连接多个用户的线程: 编辑:附加信息 在第一个客户端连

  • 问题内容: 调用一次后如何重新连接到套接字io ? 这是代码 如果我这样做,它会起作用。如果我这样做,它将断开连接。但是,如果我尝试使用重新连接,则连接不再起作用。我如何才能建立连接? 问题答案: 好吧,您可以在这里选择… 首次初始化套接字值时,应使用, 下次(调用一次断开连接后),您应使用再次连接。 所以你的应该是这样的

  • 我设置了一个测试平台,试图在同一客户端和后端服务器之间创建两个套接字。打开调试后,我可以看到对两个不同套接字(AAAA和AAAB)的xhr open GET请求,对应的套接字接收类型为“open”的消息,数据的sid响应套接字id(AAAA或AAAB)。我在下面的跟踪中突出显示了这些内容。但是,这两次都发生在socket.on之前(“connect...函数被调用,因此socket.io.engi

  • 我有几个关于Java套接字编程的问题。 > 我有一个进程需要跨多个套接字连接发送一条消息。现在我有如下内容 这是原子能的吗?或者,在并发环境中,它们是否有可能在几乎相同的时间发送? 在并发环境中,套接字连接(设置为PrintWriter)的输出流是否已经互斥?比如说,两个线程想要同时写入PrintWriter。如果没有在PrintWriter上显式互斥,流的任何输出都会被弄乱吗?

  • 如果有人对WebSocket/Socket IO有经验,希望你能给我指出正确的方向。 我制作了一个不和谐的克隆,我正试图优化它以更好地扩展。现在,当一个用户发送一条消息时,我向数据库查询该服务器的所有用户部分,并向他们的特定套接字发送一条消息。这显然不能很好地扩展,因为每条消息都需要在客户机列表中进行昂贵的查询和查找 然而,为每台服务器使用房间将消除我查询数据库的需要。我知道我可以在套接字服务器首

  • 我在使用https域和https套接字io时收到此警告。 我的代码是这样的: 希望有答案来解决这个问题。我已经从其他人那里搜索过,但我申请时发现不起作用。