繁体   English   中英

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

[英]How to read to inputstream in tcp socket communication for multiple formats in java

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

我需要确定另一端用来切换到该模式的模式,例如当使用writeUTF(String)时,我需要使用readUTF(),如果使用了write(byte []),那么我应该能够切换读取()以获取数据。

我试图使用markSupported,mark,reset但无法实现。 我打算先嗅探几个字节以了解格式,然后再切换到必要的格式。

还请指定我是否可以使用任何其他输入/输出流进行tcp通信。

我对网络通讯有基本的了解。 因此,对解决此问题的任何帮助将受到高度赞赏。 感谢您的帮助。

我不太确定您实际上要在这里实现什么。 您无法确定远端使用的是哪种方法,因为一切都会解析为发送字节流。

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

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

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

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

等等。前提是您可以更改远程端(尽管不确定!)

我建议看一下用于网络通信的apache mina框架 Mina为您处理了大多数(如果不是全部)低层网络功能。

代替DataInputStream,可以使用ObjectOutputStream进行写入,并使用ObjectInputStream进行读取。

您可以这样写:

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
    objectOutputStream.writeObject("xyz");

像这样阅读:

    ObjectInputStream objectInputStream = new ObjectInputStream(in);
    Object obj = objectInputStream.readObject();

您将遇到的问题是,您可以写的任何内容都可以使用write()做UTF(),反之亦然。 如果不对可能发送的数据类型进行一些假设,就无法分辨出差异。 可以使它在某些特定情况下有效,但在一般情况下不起作用。

读者无法可靠地知道write(byte [])写入的长度。 您可能会发现在大多数情况下,read()会在环回中读取相同的长度,但在实际网络上将无法使用。

因此,发送方执行write(byte []),然后执行writeUTF(String)。 无法知道第一次写入的时间,因此无法确定writeUTF何时开始(同样,除非您对发送的数据类型进行假设)

解决您的问题的方法是发送一段数据的长度,然后发送其数据类型。 例如

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM