Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用套接字同时发送多个类型_Java_Sockets_Network Programming_Serversocket - Fatal编程技术网

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

Java 使用套接字同时发送多个类型,java,sockets,network-programming,serversocket,Java,Sockets,Network Programming,Serversocket,我想从一个套接字向另一个套接字(从ServerSocket accept()创建)发送一个对应于两种不同类型(例如一个float和一个int)的数据流。然而,我不确定实现这一目标的最佳方式是什么。如果我想使用readInt()或readFloat(),似乎需要单独发送它们,我想这并不理想(但如果我错了,请纠正我) 代码将从执行以下操作开始(假设浮点将存储在b中的前4个字节中,int将存储在b中的最后4个字节中) 到目前为止还不错,但我现在只想将前四个字节转换为浮点,最后四个字节转换为int fl

我想从一个套接字向另一个套接字(从ServerSocket accept()创建)发送一个对应于两种不同类型(例如一个float和一个int)的数据流。然而,我不确定实现这一目标的最佳方式是什么。如果我想使用readInt()或readFloat(),似乎需要单独发送它们,我想这并不理想(但如果我错了,请纠正我)

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

到目前为止还不错,但我现在只想将前四个字节转换为浮点,最后四个字节转换为int

float myFloat = ByteBuffer.wrap(b).getFloat();
得到浮点数,但如何得到int?在C++中,我只传递B中的第五个元素的引用,但是我理解这在java中是不可能的。当然,我可以使用一些库从b的最后四个元素创建一个新数组,但这似乎有点过分了不?还是只有这样


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

使用
可序列化的
包装类存储不同类型的值和
ObjectInputStream
&
ObjectOutputStream
读取和写入类实例似乎是最好的方法实现这一目标。是很好的参考资料

我想将单个数据流[…]从套接字发送到服务器套接字

抱歉挑剔,但你不能那样做。
ServerSocket
是一种机制,用于接受连接请求并建立基于socket的通信通道的本地端。本地端一旦建立,就由一个
Socket
表示,因此您似乎想做的是将数据从
Socket
发送到
Socket

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

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

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

对于传输的每个数据,有两个基本的备选方案:

  • 指望接收者依靠某种事先约定或假设来确定如何解释该数据(可能延伸到识别其在线表示的边界),或

  • 与数据一起传输元数据,接收器将使用元数据按预期解释数据

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

    如果一条消息总是由一个float后跟一个int组成,那么我认为发送者使用

    myDataOutputStream.writeFloat(f);
    myDataOutputStream.writeInt(i);
    
    接收器通过

    myDataInputStream.readFloat(f);
    myDataInputStream.readInt(i);
    
    事实上,对于这个简单的例子,我认为这是一个很好的选择


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

    为什么不能在发送的每个值之间使用分隔符(比如换行符)?请详细介绍一下?听起来你想让我以字符串的形式发送,但我不想发送超出需要的数据(即,如果可能,我只想发送8个字节)。如果你已经知道输入将是4字节int和4字节float,那么你可以简单地逐字节准备好,并将前4个字节用于int,后4个字节用于float,如果你需要同时发送几个值,你需要一个分隔符,只要你知道一个新行是一个字节(值10),这就需要我们创建一个全新的类来存储两个变量,这似乎有点不必要?如果我发送整个类,它真的只有8字节吗?不,不会是8字节。如果您有8个字节的约束,那么可以依次使用writeFloat、writeInt&readFloat、readInt。但是,如果您没有这样的约束,那么这是解决问题的一个好方法,因为您可以通过更改类轻松地扩展和修改它。使用Java序列化不仅需要发送超过8个字节,还需要发送超过8个字节。此外,发送方和接收方都需要有相关类的定义。你可以让它工作,至少如果两端都是用Java编写的,但我不太喜欢串行化作为一种通用通信协议。谢谢,是的,我的意思是在两个套接字之间发送数据。是的,我正在考虑这样一种情况,我知道数据应该以这种特定的格式出现。我担心的是,如果我先执行writeFloat()然后执行writeInt(),套接字会分别发送这两个数据,但可能不是这样?或者“同时发送”的概念甚至不是一个定义明确的问题?对不起,我对网络非常陌生。@JonathanLindgren,一个端点由套接字表示的通信通道只是一个字节序列
    writeFloat()
    writeInt()
    将各自向该通道写入一些字节,而
    readFloat()
    readInt()
    将各自读取适当数量的字节。实际上,所有八个字节,甚至更多的字节都可能是b
    myDataInputStream.readFloat(f);
    myDataInputStream.readInt(i);