gpt4 book ai didi

java - 使用套接字同时发送多种类型

转载 作者:行者123 更新时间:2023-11-30 06:39:21 26 4
gpt4 key购买 nike

我想将与几种不同类型(为简单起见,一个 float 和一个整数)相对应的单个数据流从一个套接字发送到另一个套接字(从 ServerSocketaccept() 创建)。但是,我不确定实现这一目标的最佳方法是什么。如果我想使用 readInt() 或 readFloat() ,似乎我需要单独发送它们,我想这不太理想(但如果我错了,请纠正我)。

代码将首先执行以下操作(其中 float 将存储在 b 的前 4 个字节中,int 将存储在 b 的最后 4 个字节中)

ServerSocket socket = new ServerSocket(port);
in=new DataInputStream(socket.accept().getInputStream());

byte[] b = new byte[8];
in.read(b);

到目前为止一切顺利,但我现在只想将前四个字节转换为 float ,将最后四个字节转换为整数。我可以做类似的事情

float myFloat = ByteBuffer.wrap(b).getFloat();

获取 float ,但如何获取整数?在 C++ 中,我只会传递对 b 中第五个元素的引用,但据我了解,这在 java 中是不可能的。当然,我可以使用一些库从 b 的最后四个元素创建一个新数组,但这似乎有点矫枉过正不是吗?或者这是唯一的方法?

非常感谢有关通过套接字同时发送多种不同类型的任何其他建议。

最佳答案

I want to send a single stream of data [...] from a Socket to a ServerSocket

抱歉,我太挑剔了,但你不能这样做。 ServerSocket 是一种接受连接请求并建立基于套接字的通信 channel 本地端的机制。该本地端一旦建立,就由 Socket 表示,因此您似乎想要做的是将数据从 Socket 发送到 Socket.

但是您的问题似乎主要是关于通过通信 channel 发送混合数据。在这种情况下,要考虑的第一个问题是接收者如何知道在任何给定点尝试读取什么类型。这归结为通信双方之间具有应用层通信协议(protocol)。这不一定是正式的或宏伟的;在您的示例中,似乎有一个共同的理解,即数据将作为 32 位二进制 float 发送,后跟 32 位二进制 int。这是一个协议(protocol)。

If I want to use readInt() or readFloat() it seems that I need to send them separately, and I guess that would not be ideal

我不明白你的意思。是的,您确实需要知道哪些数据是 int 数据,哪些是 float 数据,但这并不能区分 DataInputStream.readInt() 的使用> 和来自任何其他机制的 DataInputStream.readFloat()

对于您传输的每个数据,您有两种基本选择:

  1. 依靠接收者依赖一些事先的协议(protocol)或假设来确定如何解释该数据(可能扩展到识别其在线表示的边界),或者

  2. 与数据一起传输元数据,接收者将使用该元数据按预期解释数据。

当然,(2)可以看作是(1)的特例。

如果一条消息始终由一个 float 和一个整数组成,那么我认为发送者使用它没有任何问题

myDataOutputStream.writeFloat(f);
myDataOutputStream.writeInt(i);

接收者通过处理该事件

myDataInputStream.readFloat(f);
myDataInputStream.readInt(i);

确实,对于这个简单的情况,我认为这是一个相当不错的选择。

然而,更一般地说,在选择或设计通信协议(protocol)时还有很多很多其他考虑因素。对于这个 field 来说,对该主题的一般性讨论太过广泛。

关于java - 使用套接字同时发送多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44655465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com