2014-03-02 56 views
1

我正在编写客户端服务器应用程序Java。该过程如下:如何读取数据流忽略Java中的数据类型

  1. 客户端发送的HTTP格式的消息发送到登记节点与

    • 请求行的数的标题行
    • 一个空行
    • 和身体。
    • (ASCII文本)
  2. 登记节点发送类似格式的消息发送到的服务器。

  3. 客户端和服务器可以说话(很像SIP)。

现在,我已经创建客户端和服务器的插槽,但如果我想使用DataInputStream和DataOutputStream类输入和输出数据,我还需要确定,因为从DataInputStream所喜欢的readDouble方法的数据类型。

我不知道该怎么做。

对不起,如果我的描述有点模棱两可,在这里,一些示例消息将被传输。

REGISTER [email protected] SIPL/1.0CRLF 
To: [email protected] 
From: [email protected] 
Call-ID: a74fbCRLF 
CSeq: 0CRLF 
Expires: 200CRLF 
Contact: 74.125.226.161:20132CRLF 
CRLF 

SIPL/1.0 200 okCRLF 
To: [email protected] 
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 

任何应用将真正被赞赏!

+0

如果一切都是HTTP标头和ASCII文本你为什么要处理像双重类型?也许使用一个阅读器(通过InputStreamReader)会更合适? – helderdarocha

+0

DataInputStream的'.readDouble()'将读取8个字节,它预计是double的_binary representation_;给你的转储,这不是你想要的... – fge

+0

我只是设置了一个关于数据流输入的例子。那么输入和输出这些数据的最佳方式是什么?仍然是数据流?或其他像扫描仪,printwriter等[email protected] @helderdarocha – ChesterL

回答

1

由于您正在阅读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(); 

如果您发送的文本数据,你也可以用类似的东西:在一个try-catch-finally块与close()方法

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(或者,如果你使用的Java 7,尝试与资源)

+0

非常感谢! 不是PrintWriter用于文本I/O,而BufferedReader用于二进制I/O? – ChesterL

+0

@helderdarcocha如果我想传输.dat文件该怎么办? – ChesterL

+0

读者和作家是为字符I/O。原始数据流(InputStream和OutputStream)用于二进制I /О。 InputStreamReader和OutputStreamWriter是将二进制流转换为字符流的包装器。 – helderdarocha

相关问题