定长报文 java_Java按字节读取不定长报文

本文介绍了在Java中处理通过Socket接收不定长HTTP请求报文遇到的问题,包括预设字节数组长度限制和循环读取可能导致的无限循环。作者寻求更高效且可靠的解决方案。
摘要由CSDN通过智能技术生成

今天需要编写一个接收处理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循环里面一直退不出来。

查了一下似乎除了按字节逐位读取外并没有更好的其他方法,但是不知道按字节逐位读取的效率怎么样。

各位有什么好的方法建议请不吝赐教,帮帮忙,谢谢!

展开

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值