如何读取忽略Java中数据类型的数据流

时间:2014-03-02 20:58:33

标签: java io socket.io client-server sip

我正在Java编写客户端 - 服务器应用程序。程序如下:

  1. 客户端使用

    向注册节点发送HTTP格式的消息
    • 请求行多个标题行
    • 一个空行
    • 和一个身体。
    • (ASCII文本)
  2. 注册节点向服务器发送格式相似的消息。

  3. 客户端和服务器可以通话(非常像SIP)。

  4. 目前,我已经创建了客户端和服务器的套接字,但是如果我想使用DataInputStream和DataOutputStream来输入和输出数据,我还需要确定数据类型,因为像DataInputStream这样的readDouble方法。

    我不知道该怎么做。

    很抱歉,如果我的描述有点含糊不清,请在此处传输一些示例消息。

    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
    

    任何申请都将非常感谢!!!

1 个答案:

答案 0 :(得分: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();

如果您发送文本数据,您也可以使用类似的内容:

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

使用try-catch-finally中的close()方法将所有内容放在finally块中(或者,如果您使用Java 7,则尝试使用资源)