[英]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.