我有一个会持续很长时间的套接字。客户端将通过套接字将数据请求流式传输到我的服务器应用程序。请求是一个带有二进制负载的 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/