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

时间:2017-06-20 14:11:52

标签: java sockets network-programming serversocket

我想从Socket向另一个套接字(从ServerSocket accept()创建)发送一个对应于几个不同类型(简单来说就是一个浮点数和一个int)的单个数据流。但是,我不确定实现这一目标的最佳方法是什么。如果我想使用readInt()或readFloat(),我似乎需要单独发送它们,我想这不太理想(但如果我错了请纠正我。)

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

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

到目前为止一切顺利,但我现在只希望将前四个字节转换为float,将最后四个字节转换为int。我可以做类似

的事情
Could not evaluate expression

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

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

2 个答案:

答案 0 :(得分:1)

  

我想将一个数据流从Socket发送到ServerSocket

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

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

  

如果我想使用readInt()或readFloat(),似乎我需要单独发送它们,我想这不太理想

我不明白你的意思。是的,您确实需要知道哪些数据是int,哪些是float,但这并不区分DataInputStream.readInt()DataInputStream.readFloat()与其他任何机制的区别。< / p>

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

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

  2. 连同基准,传输接收器用于按预期解释数据的元数据。

  3. 当然,(2)可以视为(1)的特例。

    如果邮件总是由一个浮点数后跟一个整数组成,那么我不会发现发件人使用

    有任何问题
    myDataOutputStream.writeFloat(f);
    myDataOutputStream.writeInt(i);
    

    和通过

    处理的接收者
    myDataInputStream.readFloat(f);
    myDataInputStream.readInt(i);
    

    事实上,对于这个简单的案例,我认为这是一个不错的选择。

    然而,更一般地,在选择或设计通信协议时存在许多其他考虑因素。关于该主题的一般性讨论对于这个场所来说太宽泛了。

答案 1 :(得分:0)

使用Serializable包装类来存储不同类型的值和ObjectInputStream&amp; ObjectOutputStream阅读&amp;编写类实例似乎是实现这一目标的最佳方法。 Herehere是很好的参考。