今天需要编写一个接收处理HTTP请求的服务端模拟程序,用Socket输入流接收不定长的请求报文,写了如下两个接收方式都不能很好地解决问题:1.预设一个一定长度的字节数组来接收请求报文...
今天需要编写一个接收处理HTTP请求的服务端模拟程序,用Socket输入流接收不定长的请求报文,写了如下两个接收方式都不能很好地解决问题:
1.预设一个一定长度的字节数组来接收请求报文
1 byte[] recvMsg = new byte[1024];
2 byte[] valiMsg = null;
3 int readed = 0;
4 try {
5 if((readed = inputStream.read(recvMsg)) > 0){
6 valiMsg = new byte[readed];
7 }
8 System.arraycopy(recvMsg, 0, valiMsg, 0, readed);
9 } catch (IOException e) {
10 // TODO Auto-generated catch block
11 logger.info("接收报文出现异常");
12 e.printStackTrace();
13 return "";
14 }
15 return new String(valiMsg).trim();
这种方式缺点是如果要接收的报文长度超过定义的字节数组长度就不能完全读取。
2.循环读取
1 byte[] valiMsg = new byte[2048];
2 byte[] recvMsg = new byte[1024];
3 int readed = -1;
4 int off = 0;
5 try {
6 while((readed = inputStream.read(recvMsg)) != -1){
7 System.arraycopy(recvMsg, 0, valiMsg, off, readed);
8 off = off + readed;
9 recvMsg = new byte[1024];
10 }
11 } catch (IOException e2) {
12 // TODO Auto-generated catch block
13 logger.info("接收报文出现异常");
14 e2.printStackTrace();
15 return "";
16 }
17 return new String(valiMsg).trim();
这种方式也是得预先知道有效部分报文的长度范围,而且如果报文中没有终止符的话就会在while循环里面一直退不出来。
查了一下似乎除了按字节逐位读取外并没有更好的其他方法,但是不知道按字节逐位读取的效率怎么样。
各位有什么好的方法建议请不吝赐教,帮帮忙,谢谢!
展开