在基于TCP的通信中,我需要在DataInputStream上监听/读取多种格式。如write和writeUTF。
我需要确定其他端使用的模式切换到该模式,例如当使用writeUTF(String)时我需要使用readUTF(),如果使用write(byte [])那么我应该是能够切换到read()来获取数据。
我尝试使用markSupported,mark,reset但无法实现它。我打算先嗅几个字节来理解格式,然后切换到必要的格式。
还请指定我是否可以使用任何其他输入/输出流进行tcp通信。
我对网络通信有基本的了解。因此,我们将非常感谢您解决此问题的任何帮助。谢谢你的帮助。
答案 0 :(得分:1)
我不太确定你想要在这里实现什么。您无法确定远程端使用的方法,因为所有将解析为发送字节流。
所以在你最后你将收到一个字节流,然后你必须确定它代表什么。你想要识别的格式是什么?你能列举这些吗?你能控制远端发送它们的方式吗?如果是这样,我会实现某种形式的标题,这样(比方说)第一个字节标识类型(例如字符串,数字数组等),然后您的客户端可以适当地切换模式。
如果您可以使用Java对象序列化和相应的对象流,那么您可以解析Java对象,然后使用instanceof例如。
ObjectInputStream ois = new ObjectInputStream(is);
Object obj = ois.readObject();
if (obj instanceof String) {
// do string-related stuff
}
等。这预先假定您可以更改远程端(虽然不确定!)
答案 1 :(得分:0)
我建议您查看apache mina framework进行网络通信。大多数(如果不是全部)低级网络功能都是从mina处理的。
答案 2 :(得分:0)
您可以使用ObjectOutputStream来编写和使用ObjectInputStream来代替DataInputStream。
您可以这样写:
ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
objectOutputStream.writeObject("xyz");
读起来像这样:
ObjectInputStream objectInputStream = new ObjectInputStream(in);
Object obj = objectInputStream.readObject();
答案 3 :(得分:0)
你将遇到的问题是,你可以写任何东西,你也可以写(),反之亦然。如果不对可能发送的数据类型做出一些假设,就无法区分它们。这可以用于某些特定情况,但在一般情况下不起作用。
读者无法可靠地知道写(byte [])写入的长度。您可能会发现read()在大多数情况下会在环回上读取相同的长度,但它无法在真实网络上运行。
因此发送方执行write(byte []),然后执行writeUTF(String)。无法知道第一次写入的时间长度,因此无法确定何时启动writeUTF(除非您对发送的数据类型做出假设,否则再次确定)
问题的解决方案是发送一段数据的长度,然后是数据类型。 e.g。
write(bytes)替换为writeInt(bytes.length),write((byte)1 / * bytes * /),write(bytes)
writeUTF(bytes)替换为byte [] bytes = text.getBytes(“UTF-8”); writeInt(bytes.length),write((byte)2 / * UTF * /),write(bytes)
这样接收者知道消息的长度及其类型。