java - 将 HTTP POST 二进制有效负载获取到 Scala 中的字节数组

标签 java http scala post protocol-buffers

我有一个会持续很长时间的套接字。客户端将通过套接字将数据请求流式传输到我的服务器应用程序。请求是一个带有二进制负载的 POST,需要将其复制到一个字节数组,我需要用它来获取 Protocol Buffer 类。

POST / HTTP/1.1
Host: 127.0.0.1:80
Accept-Encoding: identity
Content-Length: 423
Content-type: application/octet-stream

[PAYLOAD]

val out = new DataOutputStream(socket.getOutputStream())
val in = new BufferedReader(new InputStreamReader(socket.getInputStream()))

有什么想法吗?

更新 - 我得到了一个使用已弃用的 java 函数的临时解决方案 - DataInputStream.readLine。

有人可以改进这段代码吗?

val in = new DataInputStream(socket.getInputStream())
var n:Int = 0
var size:Int=0
while (n==0) {
    var str=in.readLine
    if(str==""){
        n =1
    }else{
        val breaks=str.split(" ")
        if(breaks(0).equals("Content-Length:"))size=breaks(1).toInt
    }
}
var payload:Array[Byte]=new Array(size)
n=size-1
for(i <- 0 to n) payload(i)=in.readByte

最佳答案

如果请求在你的控制之下并且是规范的,你可以像这样解析它

    static String pattern="Content-Length: ";

private static boolean readContentLength(InputStream in,int current) throws IOException
{
    int k=in.read();
    char read=(char)k ;
    if(k==-1)
        throw new IOException("-1");
    if( read!=pattern.charAt(current))
    {
        return false;
    }
    else
    {
        if(current==pattern.length()-1)
            return true;
        else
            return readContentLength(in,current+1);
    }
}

public static void main(String...args)throws Exception
{
    byte[] bs= ("POST / HTTP/1.1\r\n"+
            "Host: 127.0.0.1:80\r\n"+
            "Accept-Encoding: identity\r\n"+
            "Content-Length: 423\r\n"+
            "Content-type: application/octet-stream\r\n").getBytes();

    InputStream is=new ByteArrayInputStream(bs);

    while(readContentLength(is,0)==false)
    {

    }
    StringBuilder lengthSb=new StringBuilder();
    char c=(char) is.read();
    while('0'<=c&&c<='9')
    {
        lengthSb.append(c);
        c=(char)is.read();
    }
    int length=Integer.valueOf(lengthSb.toString());
    System.out.println(length);

}

关于java - 将 HTTP POST 二进制有效负载获取到 Scala 中的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8276515/

相关文章:

json - 将 BSON 返回到移动设备有什么问题吗?

javascript - 如何使第三方 javascript 函数使异步行为像 angular2 http 请求一样?

scala - 如何清除Scala REPL中的所有变量

ios - 在模拟器上测试使用 Web 服务器的 iOS 应用程序

Scala 类型参数边界

java - Scala 2.8.1 隐式转换为 java.util.List<java.util.Map<String, Object>>

java - MariaDB Java 客户端 1.5.7 是否兼容 JDBC 4.2

Javafx Tableview保存数据无需回车键

java - 插件 org.springframework.boot :spring-boot-maven-plugin:1. 3.0.BUILD-SNAPSHOT 或其依赖项之一无法解析

java - 在 JdbcTemplate 中处理列空值