文章目录

  • 1、编写socket通信消费端
  • 2、编写socket通信生产端
  • 3、测试结果
  • 4、其他

在我的上一篇博客——浅谈Tomcat接收到一个请求后在其内部的执行流程的第二章中提到了一个操作系统的缓冲区概念,位置如下图所示。

即浏览器发送请求后,数据是先存放到一个缓冲区,如果tomcat想要使用对应的数据,就是用相应的API去缓冲区中获取数据,即使用我们熟悉的inputStream.read进行获取。下面我将使用一个小案例来验证对应的缓冲区的存在。


1、编写socket通信消费端

public class TestServerSocket {public static void main(String[] args) throws IOException {// 1、增加一个8089的服务端口ServerSocket socket = new ServerSocket(8089);Socket accept = socket.accept();// 2、在键盘未输入前阻塞(用于验证后续方法的作用)System.in.read();// 3、获取接收到的数据流InputStream inputStream = accept.getInputStream();while (true) {// 4、使用一个死循环,不断的在接收到的数据流中读取数据,每次读取10000个字节byte[] bytes = new byte[10000];// 5、readLength 表示单次读取到的数据长度int readLength = inputStream.read(bytes);// 6、将获取到的数据以字符串的形式打印在控制台System.out.println(new String(bytes, 0, readLength));}}
}

2、编写socket通信生产端

public class TestSocket {public static void main(String[] args) throws IOException {// 1、向本地的8089端口发送数据(即和服务端匹配)Socket socket = new Socket("localhost", 8089);// 2、拿到我们即将要发送的输入流OutputStream stream = socket.getOutputStream();// 3、使用一个死循环,不断的向对应的服务端发送数据,即向输入流中写数据for (int i = 0; ; i++) {stream.write(String.valueOf(i).getBytes("UTF-8"));// 4、在控制台打印当前时间和数据,方便查看效果System.out.println(LocalTime.now());System.out.println(i);}}
}

3、测试结果

场景一:首先启动服务端,再启动客户端

根据测试结果,我们不难发现,测试结果后面的输出越来越慢。

我们使用Java的API进行数据的写入写出,两个Java类,好比两个请求,当请求的数据到达一定的量后,请求就会卡住,好像请求不动了。

这种请求不动,是否就可以理解为到达了某种阈值,好比把东西放在一个房间,房间的东西没有被拿走,那么房间能发的东西就越来越少。Java之上是JVM,JVM直接和操作系统进行交互,按照前面的分析,这个“房间”,要么是在JVM里面,要么是在操作系统里面,反正至少有一个地方有(至于是哪一个,我目前还不确定,这也从侧面表示,我之前说缓冲区是在操作系统是不准确的)。

场景二:在场景一的基础上,我在服务端,随便输入一个字符串(跳过阻塞,进入while循环,读取数据)

此时服务端不断的获取客户端发送过来的数据,客户端又能够源源不断的发送数据了,如下图所示。

还是上面的房子,房间两个门,一个人放,一个人取,并且取的速度大于等于放的速度,自然就不会出现房子装满的情况,即能够源源不断的写入数据。


4、其他

我们还能够通过这个案例,测试一下,我们服务端接受到的数据是什么样子。即开启服务端,使用浏览器发起一次请求

浏览器请求地址:http://localhost:8089/master/activity/list?pageNum=1&pageSize=10

此时控制台打印出的信息就是浏览器请求的详细信息(去掉了read的阻塞)。

这里又不得不再次提到我的上一篇文章——浅谈Tomcat接收到一个请求后在其内部的执行流程。在第三章第4节的地3条,即tomcat内部会对接受到的请求进行相应的解析处理(如下图)。对照上面测试的tomcat接收到的数据,你是不是就能更加理解tomcat解析的是什么了?

搭建Demo验证在一次Socket请求中有借助缓冲区处理数据相关推荐

  1. 在Silverlight中使用Socket进行通信(1)Socket请求-回复方式的简易数据交换

    很久之前用过Socket,由于近期项目需要用socket传输视频流,早上花了半小时回顾了一下. Socket类简要介绍 socket下提供的主要类有四个,分别是socket,tcpclient,tcp ...

  2. ADI官方源码快速搭建demo工程验证设计的正确性

    目录 1 ADI官方demo工程设计简介 2  ADI官方HDL源码介绍 2.1  HDL源码用户指导书:ADI Reference Designs HDL User Guide 2.2  C源代码下 ...

  3. Python Socket请求网站获取数据

     Python Socket请求网站获取数据 ---阻塞 I/O     ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...

  4. php实现返回界面,PHP实现模仿socket请求返回页面的方法

    本文实例讲述了PHP实现模仿socket请求返回页面的方法.分享给大家供大家参考.具体实现方法如下: $url = "www.XXXX.com"; //自己做替换 $parse = ...

  5. 什么是TSN,如何搭建TSN验证环境?

    TSN历史 由于以太网的普及度高,针对以太网的实时应用衍生出多种技术.2001年,贝加莱推出了工业领域应用的以太网POWERLINK:2003年,Siemens基于Profibus开发了PROFINE ...

  6. 【Windows Server 2019】FTP服务的配置与管理——配置FTP站点(上)IP地址限制、身份验证、授权规则和请求筛选

    目录 5. 配置FTP站点 5.1 FTP IP地址和域限制 5.2 FTP身份验证 5.3 FTP授权规则 5.4 FTP请求筛选 参考资料 关联博文 5. 配置FTP站点 5.1 FTP IP地址 ...

  7. vue + element 自定义表单验证的时候 需要通过请求后端接口验证

    vue + element 自定义表单验证的时候 需要通过请求后端接口验证 做vue项目的时候遇到了一个需求,在验证某个表单项时不仅需要是必填项而且要去通过接口校验是否有重复值. // templat ...

  8. android 上传文件到 c 服务器,android 怎么样用socket给C服务器 发送二进制数据

    最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00 ...

  9. 技术实践丨如何解决异步接口请求快慢不均导致的数据错误问题?

    本文分享自华为云社区<如何解决异步接口请求快慢不均导致的数据错误问题?>,原文作者:Kagol . 引言 搜索功能,我想很多业务都会涉及,这个功能的特点是: 用户可以在输入框中输入一个关键 ...

  10. RTMP推流协议视频直播点播平台EasyDSS请求时间接口返回的数据打印在前端页面全屏飘红问题解决

    TSINGSEE青犀视频团队接到过很多比较大的项目,这类项目的特点是接入数据量多,处理数据量也大,在对服务器造成负荷的同时,也对程序造成了堵塞. 拿EasyDSS视频直播点播平台举例,一旦EasyDS ...

最新文章

  1. python【蓝桥杯vip练习题库】ADV-183分苹果(差分数组 离线区间)
  2. 消除游戏美术设计的这些套路,你都知道吗?
  3. Adobe发布基于HTML5技术的网络开发工具以解决跨平台问题
  4. WEB界面测试用例~ 收藏
  5. win10自定义使用Mac的鼠标样式
  6. McAfee Epo
  7. 样本不均衡及其解决办法
  8. Practical Test Reminders, Character Arrays, C-Strings
  9. RxSwift+Moya之项目实战
  10. 41. 如何手动触发全量回收垃圾,如何立即触发垃圾回收
  11. android系统开机默认设置修改记录
  12. 关于Cocos2d-x节点和精灵节点的坐标、位置以及大小的设置
  13. 如果把14亿中国人拉到一个微信群
  14. linux安装cacti
  15. Win10右键菜单“发送到”添加/删除选项的方法
  16. 强大的jQuery焦点图插件Owl Carousel + 响应式图片(案例解析)
  17. 机器学习模型部署PMML
  18. centos系统安装字体
  19. Android开发浅谈:关于如何把手机壳颜色设置为我们App的主题颜色
  20. 承包经营与阿米巴经营的区别

热门文章

  1. php链接mysql数据库 p_php连接mysql数据库的几种方法
  2. 挑战性题目DSCT301:求不同形态的二叉树数目
  3. [2018.10.15 T1] 或
  4. sql between的用法的意思_SQL 语法手册来啦,你想要的这里都有!
  5. python flask 路由_python框架flask入门之路由及简单实现方法
  6. python好用的模块_Python中好用的模块们
  7. PHP网站从Apache转移到Nginx后产生404错误的原因和解决办法
  8. javaweb项目图
  9. 【转】优秀的Java程序员必须了解GC的工作原理
  10. uva live 4394 String painter 区间dp