Java 将HTTP POST二进制负载获取到Scala中的字节数组

Java 将HTTP POST二进制负载获取到Scala中的字节数组,java,http,scala,post,protocol-buffers,Java,Http,Scala,Post,Protocol Buffers,我有一个插座,可以使用很长时间。客户端将通过套接字向我的服务器应用程序发送流式数据请求。请求是一个带有二进制负载的POST,需要将其复制到字节数组中,我需要使用该字节数组来获取协议缓冲区类 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 DataOutpu

我有一个插座,可以使用很长时间。客户端将通过套接字向我的服务器应用程序发送流式数据请求。请求是一个带有二进制负载的POST,需要将其复制到字节数组中,我需要使用该字节数组来获取协议缓冲区类

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
val in=new DataInputStream(socket.getInputStream())
变量n:Int=0
变量大小:Int=0
而(n==0){
var str=in.readLine
如果(str==“”){
n=1
}否则{
val breaks=str.split(“”)
如果(中断(0).equals(“内容长度:”)大小=中断(1).toInt
}
}
var有效负载:数组[字节]=新数组(大小)
n=尺寸-1

对于(i如果请求在您的控制下并且是规范的,那么您可以像这样解析它

    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);

}
静态字符串模式=“内容长度:”;
私有静态布尔readContentLength(InputStream in,int current)引发IOException
{
int k=in.read();
字符读取=(字符)k;
如果(k==-1)
抛出新IOException(“-1”);
如果(读取!=模式字符(当前))
{
返回false;
}
其他的
{
if(当前==pattern.length()-1)
返回true;
其他的
返回readContentLength(英寸,当前+1);
}
}
公共静态void main(字符串…参数)引发异常
{
字节[]bs=(“POST/HTTP/1.1\r\n”+
“主机:127.0.0.1:80\r\n”+
“接受编码:标识\r\n”+
“内容长度:423\r\n”+
“内容类型:应用程序/八位字节流\r\n”).getBytes();
InputStream is=新的ByteArrayInputStream(bs);
while(readContentLength(is,0)=false)
{
}
StringBuilder lengthSb=新StringBuilder();
char c=(char)是.read();

而('0'如果请求在您的控制下并且是规范的,则可以像这样解析它

    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);

}
静态字符串模式=“内容长度:”;
私有静态布尔readContentLength(InputStream in,int current)引发IOException
{
int k=in.read();
字符读取=(字符)k;
如果(k==-1)
抛出新IOException(“-1”);
如果(读取!=模式字符(当前))
{
返回false;
}
其他的
{
if(当前==pattern.length()-1)
返回true;
其他的
返回readContentLength(英寸,当前+1);
}
}
公共静态void main(字符串…参数)引发异常
{
字节[]bs=(“POST/HTTP/1.1\r\n”+
“主机:127.0.0.1:80\r\n”+
“接受编码:标识\r\n”+
“内容长度:423\r\n”+
“内容类型:应用程序/八位字节流\r\n”).getBytes();
InputStream is=新的ByteArrayInputStream(bs);
while(readContentLength(is,0)=false)
{
}
StringBuilder lengthSb=新StringBuilder();
char c=(char)是.read();

while('0'好的-我得到了一个使用不推荐的java函数的临时解决方案。在您的更新版本中,.readLine
中的
从何而来?我认为这不是
DataInputStream
的方法……您还需要支持没有内容长度的分块模式吗?
val buffer=new Array[Byte](bufferSize);In.read(buffer,0,bufferSize)
。请查看BufferedInputStream文档,然后使用它。对于不完整的回答(您不仅需要流中的数组[Byte],还需要处理HTTP头),很抱歉,这对于(我没问题-我得到了一个使用不推荐的java函数的临时解决方案。在您的更新版本中,.readLine
中的
从何而来?我不认为这是
DataInputStream
的方法……您还需要支持没有内容长度的分块模式吗?
val buffer=new Array[Byte](bufferSize);In.read(buffer,0,bufferSize)
。请查看BufferedInputStream文档,然后使用它。很抱歉,答案不完整(您不仅需要流中的数组[Byte],还需要处理HTTP标头),但对于(i