IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 关于Java http服务器构建中收不到浏览器get请求的解决方案。 -> 正文阅读

[Java知识库]关于Java http服务器构建中收不到浏览器get请求的解决方案。

关于Java http服务器构建中收不到浏览器get请求的解决方案。

背景:

前几天心血来潮,想自己实现一个http服务器,我兴致勃勃地写完了处理get请求的方法,但是也发现了一个比较奇怪的现象。

现象描述:

在浏览器中输入 127.0.0.1/index.html 时,页面成功显示并不总是成功的,在后台控制台监控发现,服务器有时候会无法接受到get请求。

这下子本菜鸟,直接懵逼了,d了好久的bug都没有发现·······
为什么会出现后端服务器接受不了请求的情况呢?

在我搜寻了多方的资料以及苦逼的bug过后,终于发现了其中的奥妙。

原因在于这个代码:

int size = stream.available() ;

这串代码有什么用呢?
大家可以看一下我以下的代码:

int size = stream.available() ;
        System.out.println("request:");
        while(size--!=0){
            b = stream.read() ;
            System.out.print((char)b);
            requestBuffer.append((char)b) ;
        }

很明显,我这里调用了available方法获得了inputstream中可以读取的数据的规模,也就是get请求中的headers数据大小。我通过size控制循环读取里面的字符。

问题就出在这。

avaliable方法不是万能的。

我们对avaliable的简单印象就是 他返回的是 socket.getInputStream中能够被读取的数据,但是对于网络流来说,该方法返回0,并不意味着对方发送的流中无数据可读。

原因:网络之间的通讯是间断性的,一串字节往往分几批来进行发送,所以调用avaliable方法返回的数值长度是不唯一的,大部分情况之下是0。

这就是我们出现的问题所在。

解决方案:

在调用avaliable方法之前,调用read方法,确保能接收到数据,然后再调用avaliable方法,总长度就是avaliable + 1。具体看以下代码。

 int b = 0 ;
        StringBuffer requestBuffer = new StringBuffer() ;
        b = stream.read() ;
        requestBuffer.append((char)b) ;
        int size = stream.available() ;
        System.out.println("request:");
        while(size--!=0){
            b = stream.read() ;
            System.out.print((char)b);
            requestBuffer.append((char)b) ;
        }

至此,问题solved!
如果您想搞清楚深层原理的话,可以看一下这个大佬的博客:
https://www.cnblogs.com/zjfjava/p/10829241.html
感谢您的阅读!欢迎您的指教!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:30:26  更:2021-07-11 16:32:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:34:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码