如何在Java中读取忽略数据类型的数据流
我正在用如何在Java中读取忽略数据类型的数据流,java,io,socket.io,client-server,sip,Java,Io,Socket.io,Client Server,Sip,我正在用Java编写一个客户机-服务器应用程序。程序如下: 客户机使用向注册节点发送HTTP格式的消息 请求行包含多个标题行 空行 还有一具尸体 (ASCII文本) 注册节点向服务器发送类似格式的消息 客户端和服务器可以对话(非常像SIP) 现在,我已经创建了客户端和服务器的套接字,但是如果我想使用DataInputStream和DataOutputStream来输入和输出数据,我还需要确定数据的类型,因为像DataInputStream中的readDouble这样的方法 我不知道怎么做 抱
Java
编写一个客户机-服务器应用程序。程序如下:
- 请求行包含多个标题行
- 空行
- 还有一具尸体
- (ASCII文本)
REGISTER john@google.com SIPL/1.0CRLF
To: john@google.comCRLF
From: john@google.comCRLF
Call-ID: a74fbCRLF
CSeq: 0CRLF
Expires: 200CRLF
Contact: 74.125.226.161:20132CRLF
CRLF
SIPL/1.0 200 okCRLF
To: barney@google.comCRLF
From: 74.125.226.161:20300CRLF
Call-ID: 9934bcd2CRLF
CSeq: 10CRLF
Content-Length: 21CRLF
Contact: 74.125.226.161:20305CRLF
CRLF
file=foo
characters=10
任何申请都将不胜感激 由于您正在读取ASCII文本,并且必须处理换行符,因此可以使用读卡器和写卡器,并使用
java.io.BufferedReader
读取数据,该读卡器允许您逐行读取数据
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = reader.readLine();
StringBuilder buffer = new StringBuilder();
while ( line != null) {
buffer.append(line);
line = reader.readLine();
// you can check here if the line is empty and decide only to read the header
// or to split your header and body into different buffers
}
String fullText = buffer.toString();
如果发送文本数据,也可以使用类似的方式:
PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.println("GET / HTTP/1.1");
writer.println("Header: value");
writer.println(); // end of header
...
writer.flush(); // if you need to flush the buffer before closing
writer.close(); // when done - flushes and closes
使用
finally
中的close()
方法将所有内容放在try catch finally
块中(或者,如果使用Java 7,请使用参考资料进行尝试)如果所有内容都是HTTP头和ASCII文本,为什么要处理像double这样的类型?也许使用读取器(通过InputStreamReader)更合适?一个DataInputStream
的.readDouble()
将读取8个字节,它希望这是双精度的二进制表示形式;鉴于您的转储,这不是您想要的…我只是设置了一个关于数据流输入的示例。那么,输入和输出这些数据的最佳方式是什么?静态数据流?或者像扫描仪、printwriter等其他东西?@fge@helderdarochaj必须使用InputStream和OutputStream的方法。@EJP谢谢,InputStream和OutputStream是很好的方法,谢谢!PrintWriter不是用于文本i/o,而BufferedReader是用于二进制i/o吗?@helderdarcocha如果我想传输.dat文件怎么办?读卡器和写卡器是用于字符i/o。原始数据流(InputStream和OutputStream)是用于二进制i/o的。InputStreamReader和OutputStreamWriter是将二进制流转换为字符流的包装器。如果您的内容不是文本,则头文件应包含有关附件MIME类型的某种信息,以便在头文件完成后,知道你什么时候可以直接切换到原始流。就像我展示的样本一样,把它们都当作字符串行吗?赫尔德达科哈酒店