Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中读取忽略数据类型的数据流_Java_Io_Socket.io_Client Server_Sip - Fatal编程技术网

如何在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
编写一个客户机-服务器应用程序。程序如下:

  • 客户机使用向注册节点发送HTTP格式的消息

    • 请求行包含多个标题行
    • 空行
    • 还有一具尸体
    • (ASCII文本)
  • 注册节点向服务器发送类似格式的消息

  • 客户端和服务器可以对话(非常像SIP)

  • 现在,我已经创建了客户端和服务器的套接字,但是如果我想使用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
    

    任何申请都将不胜感激

    由于您正在读取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类型的某种信息,以便在头文件完成后,知道你什么时候可以直接切换到原始流。就像我展示的样本一样,把它们都当作字符串行吗?赫尔德达科哈酒店