java中多格式tcp套接字通信中如何读取inputstream

java中多格式tcp套接字通信中如何读取inputstream,java,tcp,Java,Tcp,在基于TCP的通信中,我需要侦听/读取DataInputStream上的多种格式。例如write和writeUTF 我需要确定另一端用于切换到该模式的模式,例如,当使用writeUTF(字符串)时,我需要使用readUTF(),如果使用write(byte[]),则我应该能够切换到read()以获取数据。 我尝试使用markSupported、mark、reset,但无法实现。我打算嗅探前几个字节以了解格式,然后切换到必要的格式。 还请指定我是否可以使用任何其他输入/输出流进行tcp通信。 我对

在基于TCP的通信中,我需要侦听/读取DataInputStream上的多种格式。例如write和writeUTF

我需要确定另一端用于切换到该模式的模式,例如,当使用writeUTF(字符串)时,我需要使用readUTF(),如果使用write(byte[]),则我应该能够切换到read()以获取数据。 我尝试使用markSupported、mark、reset,但无法实现。我打算嗅探前几个字节以了解格式,然后切换到必要的格式。 还请指定我是否可以使用任何其他输入/输出流进行tcp通信。 我对网络通信有基本的了解。因此,我们将非常感谢为解决这一问题提供的任何帮助。谢谢你的帮助


我不太清楚你到底想在这里实现什么。您无法确定远程端正在使用什么方法,因为一切都将解析为发送字节流

因此,在您的终端,您将收到一个字节流,然后您必须确定它将代表什么。您希望识别的格式集是什么?你能列举这些吗?你能控制远端如何发送它们吗?如果是这样,我将实现某种形式的头,例如(比如)第一个字节标识类型(例如字符串、数字数组等),然后您的客户机可以适当地切换模式

如果您可以使用Java对象序列化和适当的对象流,那么您可以解析Java对象,然后使用instanceof,例如

ObjectInputStream ois = new ObjectInputStream(is);
Object obj = ois.readObject();

if (obj instanceof String) {
   // do string-related stuff
}

等等。这假设您可以更改您的远程端(但不确定!)

我建议您查看一下网络通信。大多数(如果不是全部的话)底层网络功能都是由mina为您处理的。

您可以使用ObjectOutputStream来写,ObjectInputStream来读

你可以这样写:

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
    objectOutputStream.writeObject("xyz");
    ObjectInputStream objectInputStream = new ObjectInputStream(in);
    Object obj = objectInputStream.readObject();
这样读:

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
    objectOutputStream.writeObject("xyz");
    ObjectInputStream objectInputStream = new ObjectInputStream(in);
    Object obj = objectInputStream.readObject();

您将遇到的问题是,您可以编写的任何东西都可以使用write()来编写,反之亦然。如果不对可能发送的数据类型进行一些假设,就无法判断差异。这可以用于某些特定情况,但不适用于一般情况

读取器无法可靠地知道写入(字节[])的长度。您可能会发现read()在大多数情况下都会在环回上读取相同的长度,但在真正的网络上不起作用

因此,发送方执行write(字节[]),后跟writeUTF(字符串)。无法知道第一次写入的时间,因此无法确定writeUTF何时启动(同样,除非您对发送的数据类型做出假设)

问题的解决方案是发送一段数据的长度,后跟其数据类型。e、 g

write(字节)替换为writeInt(bytes.length)、write((byte)1/*bytes*/、write(bytes)

writeUTF(字节)替换为byte[]bytes=text.getBytes(“UTF-8”);writeInt(bytes.length),write((byte)2/*UTF*/),write(bytes)


这样,接收者就可以知道消息的长度和类型。

嘿,布莱恩,谢谢你的快速回复。问题是,我正在服务器上运行代码,它正在侦听多个具有不同格式的客户端与服务器通信。客户端用于写入的常见格式是writeUTF和write(字节[])。我还尝试实现一种方式,客户机可以发送前几个字节,这样我就可以通过读取了解格式;但即使将其指定为corresp格式进行读取,它也无法读取。你能帮我吗?也许最简单的方法就是让所有进程一致地写入套接字。i、 e.使用writeUTF()或write(字节[])。还请注意,writeUTF为字符串长度写入2个字节,后跟字节格式的字符串。所以你永远不会真正地去识别一种方法。另一个:-(嗨,Emre,谢谢你的建议,在启动ObjectInputStream时,我得到了一个java.io.StreamCorruptedException:无效的流头。我正在尝试用谷歌搜索它。你能告诉我如何解决这个问题吗。我必须使用DataInputStream.writeUTF(字符串)写入data.ObjectInput/OutputStream只能组合使用。它们不能与任何普通DataInput/OutputStream一起使用。