当前位置: 首页 > news >正文

【Tomcat】第一站:理解tomcat与Socket

目录

1. Tomcat

1.1 Tomcat帮助启动http服务器。

1.2 tomcat理解:

2. 计算机网络最基本的流程

 2.1 信息是怎么来的?

2.2 端口是干什么的?

3. 简单的Socket案例

服务端

客户端

启动:

3.2 在Tomcat发送信息,看能不能接收到


1. Tomcat

大公司的MVC框架都是自己设计搭建的。

Tomcat---本身只是一个web容器,这个容器能够承载项目


1.1 Tomcat帮助启动http服务器

        解释:xxxDemo  自己写好的项目,外部是无法通过http访问到这个写好的项目的,那么我们把它放进tomcat中,然后启用http,外部就能够访问了。

        http是网络访问形式,


1.2 tomcat理解:

比如,

        我们写一个a.html,在网页上打开显示访问方式:

    我们想要http访问,可以:

        把它放进tomcat中。

我们直接打开tomcat

所有的项目都在 tomcat 下的webapps目录下。

        我们在 tomcat 的 webapps 下直接新建一个文件夹(其实就是新建一个项目),起名叫 'myweb' ,  把我们写的 a.html文件放进这个文件夹中,启动tomcat。

        .bat文件是Windows的启动。

启动之后再访问a.html,此时的访问是http的访问形式。

总结

        tomcat:是服务器---->能让其中配置的项目接受http请求。


2. 计算机网络最基本的流程

1> 操作系统做网络的问答。

2> 应用程序在操作系统之上。

3> 应用程序通过Socket与操作系统通讯。

4> 操作系统之下是物理硬件--网卡

网卡通过导线相连(即网线),两个网卡通过大型的计算机网络相连。

        网卡就是 接收 和 发送 0101这样信号的。

这就是计算机网络最基本的流程。

总结

        Socket就是两个软件之间的通讯保证。 

 2.1 信息是怎么来的?

        Tomcat本身就是一个应用软件,如果我们现在去掉操作系统。

        如果一个信息发送过来,肯定是先打到网卡,然后通过Socket,最后把 当前信息 给到 应用程序Tomcat中。

2.2 端口是干什么的?

        网卡上设置有端口。

网卡:什么样的信息都可以发送到网卡。

        操作系统之上运行有各种各样的软件(WX,QQ,Tomcat...),那么,怎么把当前信息准确地发到对应的软件?

                        :通过端口。 

比如

        与微信上的女朋友说:I love you.

        与QQ上的女朋友说“今晚一起吃饭。”

   如何发送到对应的软件?

        要想被识别,信息必须带上端口号,才能对应上。


3. 简单的Socket案例

         打开IDEA,新建项目,选择java项目,SDK默认即可,其余都不选,下一步取个名字 ’javaDemo‘。

过程:

         首先,新建一个客户端,起名’SocketClient‘

客户端是发送信息的。可以理解为浏览器。 

        再新建一个类,’SocketServer‘

服务器端,类比于tomcat,接收信息。

服务端

服务端

        写个run()方法

1.创建Socket:

        监听4747端口(我们所能监听的端口,0--65535因为端口只有这些

public  static void run() throws IOException {ServerSocket serverSocket=new ServerSocket(4747);//端口的范围:0--65535}

2. 写一个循环等待客户的连接

while(true){}

        while(true)本身是一个死循环,为了不让程序卡死,我们调用一个 serverSocket.accept() 方法,阻塞监听:只有监听到客户端的信息后才会向下执行

Socket socket = serverSocket.accept();//阻塞监听,只有监听到客户端的信息后才会向下执行

3.下一步输出客户端给我们发来的程序。

        socket.getInputStream() 打开当前的输入流,接收输入的信息。

InputStream inputStream = socket.getInputStream();//打开输入流:接收输入的信息

        输入的字节流信息按字节流读取:read()阻塞

从Socket上读取对端发过来的数据一般有两种方法:


1)按照字节流读取

BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
int r = -1;
List<Byte> l = new LinkedList<Byte>();while ((r = in.read()) != -1) {l.add(Byte.valueOf((byte) r));}


2)按照字符流读取

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String s;while ((s = in.readLine()) != null) {System.out.println("Reveived: " + s);}


        这两个方法 read()readLine() 都会读取对端发送过来的数据,如果无数据可读,就会阻塞直到有数据可读。或者到达流的末尾,这个时候分别返回-1和null。
这个特性使得编程非常方便也很高效。

        信息量是多少,输入流就是0101这样的数据,最后把0101数据转换成String类型的字符串数据。

int count=0;
while(count==0){count= inputStream.available();
}
byte[] bytes=new byte[count];//010101001
inputStream.read(bytes);
String context=new String(bytes);
System.out.println(context);

客户端

1. 创建Socket

Socket socket=new Socket("127.0.0.1",4747);

          本地端口号是'127.0.0.1', 向 4747 端口号传信息。

2. 打开输出流,建立Socket连接

        getOutputStream方法得到的是一个输出流,客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。

OutputStream outputStream = socket.getOutputStream();

3. 打印输出流

PrintStream printStream=new PrintStream(outputStream);
System.out.println("hello");

若想输入自己想要的东西

Scanner scanner=new Scanner(System.in);
String context = scanner.nextLine();
printStream.println(context);

4. 关闭输出流

        close()方法用于关闭基础输出流。


启动:

        先启动服务器端,让他处于随时的监听状态。

        再启动客户端。


3.2 在Tomcat发送信息,看能不能接收到

        首先,运行服务器。

Tomcat:

4747端口发送aaaaaa.ssss

能够接收到。

        就是说,当前服务端能直接接收浏览器传输的信息的。


相关文章:

【Tomcat】第一站:理解tomcat与Socket

目录 1. Tomcat 1.1 Tomcat帮助启动http服务器。 1.2 tomcat理解&#xff1a; 2. 计算机网络最基本的流程 2.1 信息是怎么来的&#xff1f; 2.2 端口是干什么的&#xff1f; 3. 简单的Socket案例 服务端 客户端 启动&#xff1a; 3.2 在Tomcat发送信息&#xff0c;看…...

TQ15EG开发板教程:使用SSH登录petalinux

本例程在上一章“创建运行petalinux2019.1”基础上进行&#xff0c;本例程将实现使用SSH登录petalinux。 将上一章生成的BOOT.BIN与imag.ub文件放入到SD卡中启动。给开发板插入电源与串口&#xff0c;注意串口插入后会识别出两个串口号&#xff0c;都需要打开&#xff0c;查看串…...

Java从入门到工作4 - MySQL

一&#xff1a;检测数据库网络 telnet 127.0.0.1 3306 注意ip和端口后之间是空格&#xff0c;不需要引号 二&#xff1a;SQL语法 1、创建结果集 SELECT 电视机 AS typeUNION SELECT 电冰箱UNION SELECT 洗衣机UNION SELECT 空调UNION SELECT 电脑UNION SELECT 热水器UNION…...

OpenShift 4 - 多云管理(2) - 配置多集群观察功能

《OpenShift / RHEL / DevSecOps 汇总目录》 本文在 OpenShift 4.17 RHACM 2.12 环境中进行验证。 文章目录 多集群观察技术架构安装多集群观察功能监控多集群的运行状态监控多集群的应用运行在被管集群监控应用运行在管理集群监控被管集群的应用运行 参考 多集群观察技术架构…...

【鸿睿创智开发板试用】RK3568 NPU的人工智能推理测试

目录 引言 驱动移植 例程编译 修改build.sh 执行编译 运行测试 部署libc的库文件 执行测试程序 结语 引言 鸿睿创智的H01开发板是基于RK3568芯片的&#xff0c;瑞芯微芯片的一大特色就是提供了NPU推理的支持。本文将对其NPU推理进行测试。 驱动移植 H01的开发板已经…...

iOS swift开发系列 -- tabbar问题总结

1.单视图如何改为tabbar&#xff0c;以便显示2个标签页 右上角➕&#xff0c;输入tabbar 找到控件&#xff0c;然后选中&#xff0c;把entrypoint移动到tabbar控件 2.改成tabbar&#xff0c;生成两个item&#xff0c;配置各自视图后&#xff0c;启动发现报错 Thread 1: “-[p…...

四、CSS3

一、CSS3简介 1、CSS3概述 CSS3 是 CSS2 的升级版本&#xff0c;他在CSS2的基础上&#xff0c;新增了很多强大的新功能&#xff0c;从而解决一些实际面临的问题。 CSS在未来会按照模块化的方式去发展&#xff1a;https://www.w3.org/Style/CSS/current-work.html …...

Three使用WebGPU的关键TSL

Three.js 使用 WebGPU 的关键 TSL TSL: three.js shader language 介绍 three.js 材质转为webgpu的关键流程, 从而引出 TSL. 1、关键类关系 WebGPURenderer|-- library: StandardNodeLibrary|-- _nodes: Nodes|-- _objects: RenderObjects|-- createRenderObject()StandardN…...

ESP32-S3模组上跑通ES8388(30)

接前一篇文章:ESP32-S3模组上跑通ES8388(29) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回终于解析完了es8388_init函数的所有代码。本回回到调用它的地方,继续往下讲解。 我们是从ESP32-S3模组上跑通ES8388(7)-CSDN博客开始进入es8388_init函数,展开对于它的解析的…...

概率论得学习和整理24:EXCEL的各种图形,统计图形

目录 0 EXCEL的各种图形&#xff0c;统计图形 1 统计图形 / 直方图 / 其实叫 频度图 hist最合适(用原始数据直接作图) 1.1 什么是频度图 1.2 如何创建频度图&#xff0c;一般是只选中1列数据&#xff08;1个数组&#xff09; 1.3 如何修改频度图的宽度 1.4 hist图的一个特…...

WPF中依赖属性的底层和普通属性的底层有什么不一样

WPF中依赖属性的底层 在 WPF 中&#xff0c;依赖属性&#xff08;Dependency Property&#xff09;是 WPF 属性系统的核心&#xff0c;它支持功能强大的特性&#xff08;如数据绑定、动画、样式等&#xff09;。其底层实现是围绕 DependencyObject 类展开的。以下是 WPF 中依赖…...

【Qt】drawText字体大小问题探究

背景 软件的一个功能是&#xff1a; 打开图片在图片上绘制序号&#xff0c;序号的样式是圆圈内包含数字将带有序号的图片打印出来 实现思路也很简单&#xff0c;在屏幕上显示时重写paintEvent函数&#xff0c;利用QPainter完成图片和序号的绘制。打印时只需要将QPainter对应…...

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎&#xff0c;随着智能驾驶时代的到来&#xff0c;应用也会越来越广泛&#xff0c;关于mapbox-gl和其他地理引擎的详细对比&#xff08;比如CesiumJS&#xff09;&#xff0c;后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…...

【C++】高级分析 switch 语句的应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;switch 语句的基本用法语法结构核心要点实例演示正确实现 期望输出错误实现错误输出 &#x1f4af;if 与 switch 语句的实现比较使用 if 语句使用 switch 语句比较分析 &am…...

活动预告 | Surface 来了#11:Windows 11 AI+ PC,释放 AI 办公设备的无限潜能

课程介绍 欢迎来到 Surface 来了第 11 期节目。 今年 5 月底&#xff0c;微软推出了专为 AI 体验而设计的全新 Windows PC 品类&#xff1a;Windows 11 AI PC。 微软通过 Windows 11 AI PC&#xff0c;进一步强调了 NPU 在运行设备端 AI 功能的重要性。并要求符合这一品类的…...

php基础:正则表达式

1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止&#xff0c;我们前面所用过的精确&#xff08;文本&#xff09;匹配也是一种正则表达式。 在PHP中&#xff0c;正则表达式一般是由正规字…...

go语言压缩[]byte数据为zlib格式的时候,耗时较多,应该怎么修改?

在Go语言中使用compress/flate包来实现Zlib格式的压缩时&#xff0c;如果发现压缩耗时较多&#xff0c;可以考虑以下几个优化方向&#xff1a; ### 1. 压缩级别 默认情况下&#xff0c;compress/flate包中的NewWriter函数使用的是默认压缩级别&#xff08;BestSpeed和BestComp…...

[机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)

AdaBoost AdaBoost&#xff08;Adaptive Boosting&#xff09;是一种Boosting算法&#xff0c;它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高分类性能。 AdaBoost算法的特点是它能够自适应地调整样本的权重&#xff0c;使那些被错误分类的样本在后续的训练中得到…...

深入了解Spring

目录 Spring基础 什么是Spring框架&#xff1f; Spring 包含的模块有哪些&#xff1f; Core Container AOP Data Access/Integration Spring Web Messaging Spring Test Spring,Spring MVC,Spring Boot 之间什么关系? Spring基础 什么是Spring框架&#xff1f; Sp…...

jar 包如何下载

maven官网&#xff1a;https://mvnrepository.com/ 点击搜索&#xff0c;找对应搜索结果点击...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...