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();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.3 Windows驱动开发:内核MDL读写进程内存

MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式。在Windows操作系统中&#xff0c;每个进程都有自己独立的虚拟地址空间&#xff0c;不同进程之间的内存空间是隔离的。因此&#xff0c;要在一个进程中读取或写入另一个进程的内存数据&#xff0c;需要先将目标进…

unity教程

前言 伴随游戏行业的兴起&#xff0c;unity引擎的使用越来越普遍&#xff0c;本文章主要记录博主本人入门unity的相关记录大部分依赖siki学院进行整理。12 一、认识unity引擎&#xff1f; 1、Unity相关信息&#xff1a; Unity的诞生&#xff1a;https://www.jianshu.com/p/550…

Springboot更新用户头像

人们通常(为徒省事)把一个包含了修改后userName的完整userInfo对象传给后端&#xff0c;做完整更新。但仔细想想&#xff0c;这种做法感觉有点二&#xff0c;而且浪费带宽。 于是patch诞生&#xff0c;只传一个userName到指定资源去&#xff0c;表示该请求是一个局部更新&#…

Filter和ThreadLocal结合存储用户id信息

ThreadLocal并不是一个Thread&#xff0c;而是Thread的局部变量。当使用ThreadLocal维护变量时&#xff0c;ThreadLocal为每个使用该变量的线程提供独立的变量副本&#xff0c;所以每一个线程都可以独立地改变自己的副本&#xff0c;而不会影响其它线程所对应的副本。ThreadLoc…

十一、统一网关GateWay(搭建网关、过滤器、跨越解决)

目录 一、网关技术的实现 在SpringCloud中网关的实现包括两种: 作用&#xff1a; 二、搭建网关服务 1、新建模块&#xff0c;并添加依赖 2、新建Gateway包&#xff0c;并编写启动类 3、编写yml文件 4、启动服务&#xff0c;并在网页内测试 5、步骤 三、路由断言工厂 …

android PopupWindow设置

记录一个小功能&#xff0c;使用场景&#xff0c;列表项点击弹出 如图&#xff1a; java类代码&#xff1a; public class PopupUtil extends PopupWindow {private Activity context;private View view;private ListView listView;private TextView m_tv_reminderm, m_tv_Wa…

专注于绘画,不受限制!尝试Growly Draw for Mac的快速绘画应用

Growly Draw Mac版是Mac平台上的一款绘画应用&#xff0c;它提供了简单易用的画板页面和多种色彩、画笔工具&#xff0c;让你可以轻松地完成作画。无论你是初学者还是专业人士&#xff0c;都可以在这款应用中找到适合自己的绘画方式。通过使用Growly Draw Mac版&#xff0c;你可…

高防IP是什么?如何隐藏源站IP?如何进行防护?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下,推出的付费增值服务。用户在数据不转移的情况下,就可以通过配置高防IP , 将攻击流量引流到高防|P,确保源站的稳定可靠。高防IP采用的技术手段包括DDoS防护、WAF ( Web应用程序防火墙)等,它能够有效抵御来…

机器学习第7天:逻辑回归

文章目录 介绍 概率计算 逻辑回归的损失函数 单个实例的成本函数 整个训练集的成本函数 鸢尾花数据集上的逻辑回归 Softmax回归 Softmax回归数学公式 Softmax回归损失函数 调用代码 参数说明 结语 介绍 作用&#xff1a;使用回归算法进行分类任务 思想&#xff1a;…

Lstm+transformer的刀具磨损预测

视频讲解: 基于Lstm+transformer的刀具磨损预测实战_哔哩哔哩_bilibili 结果展示: 数据展示: 主要代码: # pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/ # pip install optuna -i https://pypi.tuna.tsinghua.edu.cn/simple/ import numpy as np…

深信服AC应用控制技术

拓扑图 目录 拓扑图 一.上班时间不允许使用qq(假设上班时间是上午9到12&#xff0c;下午14到18) 1.新增上班时间不允许使用qq访问权限策略 2.将策略应用到组&#xff0c;例如修仙部 3.验证 上班时间发现登录不了 下班时间可以登录 二.上班时间不允许访问视频网站(假设上班时…

SQLite3 数据库学习(一):数据库和 SQLite 基础

参考引用 SQL 必知必会SQLite 权威指南&#xff08;第二版&#xff09;关系型数据库概述 1. 数据库基础 1.1 什么是数据库 数据库&#xff08;database&#xff09;&#xff1a;保存有组织的数据的容器&#xff08;通常是一个文件或一组文件&#xff09; 可以将其想象为一个文…

idea查看UML类图

idea查看UML类图 一、如何查看UML类图 1.1 选择需要查看的类或者包&#xff0c;鼠标右键&#xff0c;选择Diagrams->Show Diagram 1.2 对于UML类图中的包&#xff0c;选中后点击鼠标右键-> Expand Nodes(展开节点) 展开前 展开后 1.3 展开后分布比较凌乱&#xff…

带你快速掌握Linux最常用的命令(图文详解)- 最新版(面试笔试常考)

最常用的Linux指令&#xff08;图文详解&#xff09;- 最新版 ls&#xff1a;列出目录中的文件和子目录。&#xff08;重点&#xff09;cd&#xff1a;改变当前工作目录。绝对路径&#xff1a;相对路径 pwd&#xff1a;显示当前工作目录的路径。mkdir&#xff1a;创建一个新的目…

教你轻松解决win系统ucrtbased.dll丢失的问题,亲测有效!

ucrtbased.dll是一个动态链接库文件&#xff08;DLL&#xff09;&#xff0c;它是Windows操作系统中的一部分&#xff0c;主要负责提供操作系统和应用程序所需的函数和接口。这个文件包含了操作系统和应用程序共同使用的通用代码&#xff0c;以确保不同程序之间的兼容性和稳定性…

6.2 List和Set接口

1. List接口 List接口继承自Collection接口&#xff0c;List接口实例中允许存储重复的元素&#xff0c;所有的元素以线性方式进行存储。在程序中可以通过索引访问List接口实例中存储的元素。另外&#xff0c;List接口实例中存储的元素是有序的&#xff0c;即元素的存入顺序和取…

C语言之for while语句详解

C语言之for while语句详解 文章目录 C语言之for while语句详解简介1 while语句1.1while语句的格式1.2 while语句的实践 2 for2.1 for语句格式2.2 for循环的实践 3 do while3.1 do while语句格式3.2 do while循环的实践 3 循环中break和continue3.1 while语句中的break和continu…

编写程序,要求输入x的值,输出y的值。分别用(1)不嵌套的if语句(2)嵌套的if语句(3)if-else语句(4)switch语句。

编写程序&#xff0c;要求输入x的值&#xff0c;输出y的值。分别用&#xff08;1&#xff09;不嵌套的if语句&#xff08;2&#xff09;嵌套的if语句&#xff08;3&#xff09;if-else语句&#xff08;4&#xff09;switch语句。 选择结构是编程语言中常用的一种控制结构&…

长短期记忆(LSTM)与RNN的比较:突破性的序列训练技术

长短期记忆&#xff08;Long short-term memory, LSTM&#xff09;是一种特殊的RNN&#xff0c;主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说&#xff0c;就是相比普通的RNN&#xff0c;LSTM能够在更长的序列中有更好的表现。 Why LSTM提出的动机是为了解…

django理解02 前后端分离中的问题

前后端分离相对于传统方式的问题 前后端数据交换的问题跨域问题 页面js往自身程序&#xff08;django服务&#xff09;发送请求&#xff0c;这是浏览器默认接受响应 而请求其它地方是浏览器认为存在潜在危险。自动隔离请求&#xff01;&#xff01;&#xff01; 跨域问题的解决…