B031-网络编程 Socket Http TomCat
目录
- 计算机网络
- 网络编程相关术语
- IP地址
- ip的概念
- InerAdress的了解与测试
- 端口
- URL
- TCP、UDP和7层架构
- TCP
- UDP
- TCP与UDP的区别和联系
- TCP的3次握手
- 七层架构
- Socket编程
- 服务端代码
- 客户端代码
- http协议
- 概念
- Http报文
- Tomcat模拟
计算机网络
见文档
网络编程相关术语
见文档
IP地址
ip的概念
一个局域网内不同计算机的网段是一样的,广域网IP也是一样的
同一台计算机中可以存在多个不同类型IP,如本地局域网IP,无线局域网IP,广域网IP等
在运营商开户获得分配的ip
找人要先找广域网IP,再找局域网IP,才能最后找到
在局域网内部以局域网IP为身份,在外部广域网以广域网IP为身份。
InerAdress的了解与测试
@Testpublic void test4() throws Exception {InetAddress localHost = InetAddress.getLocalHost();System.out.println("localHost = " + localHost); //localHost = LAPTOP-25C35TNG/192.168.1.115InetAddress name = InetAddress.getByName("LAPTOP-25C35TNG");System.out.println("name = " + name); //name = LAPTOP-25C35TNG/192.168.1.115InetAddress baidu = InetAddress.getByName("baidu.com");System.out.println("baidu = " + baidu); //baidu = baidu.com/39.156.66.10// 用ping也能拿到域名下的ipboolean reachable = baidu.isReachable(100);System.out.println("reachable = " + reachable); //reachable = true}
端口
端口port用来区分不同的应用程序,端口号范围为065535,其中01023被系统所保留,如果自定义端口号,建议为1023以后的
URL
@Testpublic void test5() throws Exception {//创建输入流URL url = new URL("https://www.baidu.com/");InputStream in = url.openStream();//获取输出流FileOutputStream out = new FileOutputStream("D:/test/baidu.html");//实现下载
/* byte[] b = new byte[1024];int i = 0;while ((i=in.read(b))!=-1){out.write(b,0,i);} *///用此IOUtils包可以替换以上代码IOUtils.copy(in,out);//释放资源out.close();in.close();}
@Testpublic void test6() throws Exception {String encode = URLEncoder.encode("连衣裙", "utf-8");System.out.println("encode = " + encode);//%E8%BF%9E%E8%A1%A3%E8%A3%99String decode = URLDecoder.decode("%E8%BF%9E%E8%A1%A3%E8%A3%99", "utf-8");System.out.println("decode = " + decode);}
TCP、UDP和7层架构
TCP
1.TCP协议是Transmission Control Protocol传输控制协议,TCP是一种面向连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。
2.当客户和服务器彼此交互数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据,TCP 协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端,故而效率低,速度慢;
3.TCP可靠传输协议,不丢包,经常用来传输文件(回值内部处理),缺点是效率低,慢,而且占用资源,相当于打电话;
UDP
1.UDP(User Datagram Protocol)是一种无连接、不可靠、基于数据报的用户数据协议。
2.UDP在传输数据报前不用在客户和服务器之间建立一个连接。它只是把数据报发送出去,但是并不能保证他们能到达目的,并且没有超时重发机制,故而传输速度很快;
3.UDP不可靠传输协议,容易丢包。但是效率高,快,占用资源少。一般游戏中数据采用UDP传输数据,相当于发短信,快递;
TCP与UDP的区别和联系
1.首先它们都是传输层的协议;
2.TCP 协议可靠,UDP 协议不可靠。可靠即指数据由A发送到B,是否能确保数据真的有送达到B;TCP 协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端。而 UDP 协议无法保证数据从发送端正确传送到目的端,如果数据在传输过程中丢失或者目的端通过数据检验发现数据错误,则UDP协议只是简单地通知应用程序发送失败。对于 TCP 协议拥有的超时重传、数据确认等需要应用程序自己来处理这些逻辑;
3.TCP 是面向连接的,UDP 是无连接的。这也比较好理解,因为 TCP 连接需要经历"三次握手";
4.TCP 服务是基于流的,而UDP是基于数据报的,基于流的数据没有边界(长度)限制,而基于数据报的服务,每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出;
5.总之:TCP 协议为应用层提供可靠的、面向连接的、基于流的服务。而 UDP 协议则与 TCP 协议完全相反,它为应用层提供不可靠、无连接和基于数据报的服务;
TCP的3次握手
见文档,简单理解如下图
七层架构
物理层:光纤,网线
数据链路层:网卡,网桥
网络层:IP地址寻址,即IP协议
传输层:TCP、UDP,数据按包来发送
会话层:防止不断地IP寻址,
表示层:解决不同系统之间的通信语法问题,如linux,windows
应用层:定义了用于在网络中进行通信和传输数据的接口
https://blog.csdn.net/weixin_39855693/article/details/89228286
Socket编程
服务端代码
demo版代码
public class Server {public static void main(String[] args) throws Exception {// 初始化服务器System.out.println("初始化服务器");ServerSocket serverSocket = new ServerSocket(8089);System.out.println("服务器初始化成功");// 监听服务器Socket accept = serverSocket.accept();System.out.println("服务器连接成功");String hostName = accept.getInetAddress().getHostAddress();System.out.println("hostName = " + hostName);// 接收消息InputStream in = accept.getInputStream();// 转成字符流InputStreamReader inputStreamReader = new InputStreamReader(in,"UTF-8");// 放到缓冲流之后可以一行一行读数据BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String line = bufferedReader.readLine();System.out.println("客户端说 = " + line); // line = GET /?name=hello HTTP/1.1// http://192.168.1.115:8088/?name=hello}
}
优化版代码
public class Server {ServerSocket serverSocket ;public Server() throws IOException{System.out.println("初始化服务器");serverSocket = new ServerSocket(8088);System.out.println("服务器初始化成功.......");}public static void main(String[] args) throws IOException {Server server = new Server();server.start();}public void start() throws IOException{// 监听服务器System.out.println("服务启动成功等待连接");Socket accept = serverSocket.accept();System.out.println("服务器连接成功");// 得到连接者名字String hostName = accept.getInetAddress().getHostAddress();System.out.println("连接服务器的名字是"+hostName);// 接收客户端的消息 InputStream in = accept.getInputStream();// 转为字符流InputStreamReader inputStreamReader = new InputStreamReader(in,"UTF-8");// 放到缓冲流之后可以一行一行读数据BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//读取一行String readLine = bufferedReader.readLine();System.out.println("客户端说:"+readLine);}}
客户端代码
public class Center {Socket socket;public Center() throws IOException{System.out.println("初始化客户端...");socket=new Socket("localhost", 8089);System.out.println("已经连接上服务端");}public static void main(String[] args) throws IOException {Center center = new Center();center.start();}public void start() throws IOException{//向服务端发送消息//客户端获取了一个输出流OutputStream out = socket.getOutputStream();//包装流OutputStreamWriter os = new OutputStreamWriter(out, "UTF-8");//可以传输中文os.write("你好,服务器\n");os.flush(); //刷新缓冲区,强制写出缓冲区的内容}
}
http协议
概念
不同的浏览器共同遵守的接收和发送数据的规范
网站可以根据请求头里的这些信息来决定返回哪种语言和格式版本的网页
Http报文
见文档
Tomcat模拟
底层用的socket编程,服务端接收客户端(浏览器)请求,返回html给客户端访问
package cn.itsource.Test;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class TomcatServer {private ServerSocket ss;//构造器中初始化服务器的套接字public TomcatServer() {try {//初始化服务器,指定端口,访问时用该端口ss = new ServerSocket(8091);} catch (IOException e) {e.printStackTrace();}}public void start() throws IOException{//监听客户端的访问Socket socket = ss.accept();//创建输出流OutputStream os = socket.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");PrintWriter pw = new PrintWriter(osw,true);//创建输入流:根据用户的访问找到服务器中的资源,用流的方式写出去File file = new File("D:\\HBuilderProjects\\TestWebProject\\test.html");InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");BufferedReader br = new BufferedReader(isr);//如何输出到页面呢?设置响应信息 -- 不然就只能输出到控制台或文本中,但是用户就需要在页面中看到内容,所以需要设置响应信息pw.println("http1.1 200 OK");//1.设置响应头:协议版本 状态码 状态描述pw.println("Content-Type: text/html;charset=UTF-8");//2.设置响应类型和字符编码
// pw.println("Content-Length: "+file.length());//可以不写pw.println();//3.结束头部信息 -- 表示结束头部信息,接下来开始写内容//响应的内容String len = null;while((len=br.readLine())!=null){pw.println(len);}// pw.println("<h1>你好</h1>");//关流pw.close();br.close();}public static void main(String[] args) throws IOException {TomcatServer web = new TomcatServer();while(true){web.start();}}
}
相关文章:

B031-网络编程 Socket Http TomCat
目录 计算机网络网络编程相关术语IP地址ip的概念InerAdress的了解与测试 端口URLTCP、UDP和7层架构TCPUDPTCP与UDP的区别和联系TCP的3次握手七层架构 Socket编程服务端代码客户端代码 http协议概念Http报文 Tomcat模拟 计算机网络 见文档 网络编程相关术语 见文档 IP地址 …...
gRPC之metadata
1、metadata 服务间使用 Http 相互调用时,经常会设置一些业务自定义 header 如时间戳、trace信息等,gRPC使用 HTTP/2 协议自然也是支持的,gRPC 通过 google.golang.org/grpc/metadata 包内的 MD 类型提供相关的功能接口。 1.1 类型定义 /…...

【OpenCV实现图像:OpenCV进行OCR字符分割】
文章目录 概要基本概念读入图像图像二值化小结 概要 在处理OCR(Optical Character Recognition,光学字符识别)时,利用传统的图像处理方法进行字符切分仍然是一种有效的途径。即便当前计算机视觉领域主导的是卷积神经网络…...

景联文科技入选量子位智库《中国AIGC数据标注产业全景报告》数据标注行业代表机构
量子位智库《中国AIGC数据标注产业全景报告》中指出,数据标注处于重新洗牌时期,更高质量、专业化的数据标注成为刚需。未来五年,国内AI基础数据服务将达到百亿规模,年复合增长率在27%左右。 基于数据基础设施建设、大模型/AI技术理…...

ClickHouse SQL操作
基本上来说传统关系型数据库(以MySQL为例)的SQL语句,ClickHouse基本都支持,这里不会从头讲解SQL语法只介绍ClickHouse与标准SQL(MySQL)不一致的地方。 1 Insert 基本与标准SQL(MySQL)…...
Ubuntu安装Python环境(使用VSCode)
想在Ubuntu上安装Python环境,选择了VSCode,而不想多装Anaconda等环境,最后参考了这篇博客: python入门开发:ubuntu下搭建python开发环境(vscode)...

QTcpSocket发送结构体的做法
作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> QTcpSocket发送结构体其实很简单:使用QByteArray类对象进行封装发送,示例代码如下: /* 消息结构体 */ struct stMsg {int m_A…...

微服务学习 | Ribbon负载均衡、Nacos注册中心、微服务技术对比
Ribbon负载均衡 负载均衡流程 负载均衡策略 通过定义IRule实现可以修改负载均衡规则,有两种方式: 1. 代码方式:在服务消费者order-service中的OrderApplication类中,定义一个新的IRule: 2.配置文件方式: 在order-service的application.yml…...

【FPGA】zynq 单端口RAM 双端口RAM 读写冲突 写写冲突
RAMRAM读写分类RAM原理及实现RAM三种读写模式不变模式写优先读优先 单端口 RAM伪双端口 RAM真双端口 RAM读写冲突和写写冲突读写冲突写写冲突总结: RAM RAM 的英文全称是 Random Access Memory,即随机存取存储器,简称随机存储器,…...

【备忘】websocket学习之挖坑埋自己
背景故事 以前没有好好学习过websocket,只知道它有什么用途,也知道是个好东西,平时在工作中没用过,所以对它并不知所以然。如今要做个自己的项目,要在付款的时候实时播报声音。自己是个开发者,也不想用别人…...
大数据研发工程师面试
文章目录 面试1.AUC,ROC,准确率与召回率都是怎么计算的?2.数据清洗是如何清洗的,要做哪些清洗的工作?3.什么是数据的完整性?4.数仓是怎么设计的?5.linux查看进程的命令是什么,如何查看具体某一行的内容(查看第n至m行࿰…...

【星海出品】云存储 ceph
https://ceph.com/en/ ceph组件介绍 Monitor 一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。 OSD OSD全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有…...
[nlp] grad norm先降后升再降
grad norm先降后升再降正常嘛 在深度学习中,梯度的范数通常被用来衡量模型参数的更新程度,也就是模型的学习进度。在训练初期,由于模型参数的初始值比较随机,梯度的范数可能会比较大,这是正常现象。随着模型的训练&…...
云积天赫AI全域营销系统,为品牌营销注入新活力
AIGC(生成式人工智能)的出现,标志着人工智能已经进入了一个全新的时代,它与传统的人工智能不同,可以更好地理解品牌的需求,并提供更精准的答案。目前,AIGC已经深入到各个领域,其中营…...
Arthas在线修改Java代码
Arthas在线修改Java代码 jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.javamc /tmp/UserController.java -d /tmpretransform /tmp/com/example/demo/arthas/user/UserController.class参考链接: arthas retransform...
mapbox支持的坐标系
mapbox 中只支持 web墨卡托坐标系,不支持经纬度坐标系。 栅格数据 基于经纬度坐标系的栅格数据没有办法渲染。矢量数据 矢量数据代码中会自动转换成墨卡托投影坐标系再渲染。 输出坐标时候还是经纬度。...

腾讯云新客户优惠服务器88元/年,540元/3年,另有5年优惠服务器
在选择云服务器时,首先需要考虑的是性能与配置是否与自己的需求相匹配。对于小型网站或者个人博客,轻量应用服务器是一个不错的选择。腾讯云双十一活动中,2核2G轻量应用服务器的活动优惠价为88元/年,2核4G轻量应用服务器的活动优惠…...

伦敦银和美白银的关系
与黄金相似,世界上白银交易的基础就是伦敦白银市场,人们利用设立在伦敦的专们负责清算银行(与黄金的清算银行相同)所开设的账户进行白银保证金交易。在伦敦市场,以美元清算的伦敦白银价格,是以美元买进1金衡…...

Matplotlib的使用方法
Matplotlib是Python最著名的绘图库,它提供了一整套和Matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入到GUI应用程序中。Matplotlib能够创建多数类型的图表,如条形图、散点图、条形图、饼图…...

【入门篇】1.7 Redis 之 codis 入门介绍
文章目录 1. 简介2. Codis的安装与配置下载编译源码安装1. 安装 Go 运行环境2. 设置编译环境3. 下载 Codis 源代码4. 编译 Codis 源代码 Docker 部署 3. Codis的架构Codis的架构图和组件Codis的工作流程 4. Codis的核心特性自动数据分片数据迁移高可用性全面支持Redis命令分布式…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...