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的了解与测试
    @Test
    public void test4() throws Exception {
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println("localHost = " + localHost);		//localHost = LAPTOP-25C35TNG/192.168.1.115
        
        InetAddress name = InetAddress.getByName("LAPTOP-25C35TNG");
        System.out.println("name = " + name);				//name = LAPTOP-25C35TNG/192.168.1.115
        
        InetAddress baidu = InetAddress.getByName("baidu.com");
        System.out.println("baidu = " + baidu);				//baidu = baidu.com/39.156.66.10
        // 用ping也能拿到域名下的ip
        
        boolean reachable = baidu.isReachable(100);
        System.out.println("reachable = " + reachable);		//reachable = true
    }
端口

端口port用来区分不同的应用程序,端口号范围为065535,其中01023被系统所保留,如果自定义端口号,建议为1023以后的

URL

在这里插入图片描述

    @Test
    public 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();
    }
    @Test
    public void test6() throws Exception {
        
        String encode = URLEncoder.encode("连衣裙", "utf-8");
        System.out.println("encode = " + encode);

        //%E8%BF%9E%E8%A1%A3%E8%A3%99
        String 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();
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Proteus仿真】【STM32单片机】锂电池管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602显示模块、DS18B20温度传感器、PCF8691 ADC模块、按键、LED蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示温…

2核2G3M带宽云服务器99元(续费同价),阿里云老用户可买!

在阿里云的双11云服务器活动中&#xff0c;用户对轻量服务器2核2G3M带宽和经济型e实例2核2G配置3M带宽特别关注。除了这两款产品&#xff0c;阿里云还提供了其他性价比很高的云服务器配置&#xff0c;让用户有更多的选择。 经济型e实例2核2G3M配置99元一年是适用于个人和普通企…

《向量数据库指南》——TruLens 用于语言模型应用跟踪和评估

TruLens 用于语言模型应用跟踪和评估 TruLens 是一个用于评估语言模型应用(如 RAG)的性能的开源库。通过 TruLens,我们还可以利用语言模型本身来评估输出、检索质量等。 构建语言模型应用时,多数人最关心的问题是 AI 幻觉(hallucination)。RAG 通过为语言模型提供检索上下文…

ython requests 库中 POST 方法的使用及文档改进

在使用Python库requests的过程中&#xff0c;发起者r1chardj0n3s遇到了一个关于POST方法的问题。他表示&#xff0c;他花费了一些时间才弄清楚requests.post函数的使用方法。然而&#xff0c;在requests的官方文档中&#xff0c;关于POST方法的描述只出现在API文档中&#xff0…

基于springboot实现医患档案管理系统项目【项目源码】计算机毕业设计

基于springboot实现医患档案管理系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的…

【博客系统】 一

该博客系统基于servlet和mysql数据库 , 并且通过xshell终端工具部署至云服务器. 实现的功能包括: 1.博客列表页 2.博客详情页 3.登陆页面 4.强制登陆检查 5.获取用户信息 6.退出登陆 7.发布博客 一.系统展示 登陆页面 博客列表页 博客详情页 博客编辑页 下面就开始编写代码了.…

【Linux】Linux进程间通信(一)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

如何选择适合企业的数字化看板系统

数字化看板是一种数字化管理工具&#xff0c;它具有实时数据展示、任务分配与优先级管理、问题追踪与解决、供应链管理与协同以及数据分析与预测等功能。这些功能可以帮助企业提高生产效率、降低成本、优化资源配置并实现生产过程的透明化。 具体来说&#xff0c;数字化看板可以…

Navicat 使用

安装包请私信本人 软件安装 需要注意以下不要先运行navicat软件,先运行 在工具的第一个选项(1.Patch)里选择Backup&#xff0c;然后点击&#xff0c;Patch按钮&#xff0c;选择Navicat的安装位置中的navicat.exe文件 如果显示这样表示成功了 在这选择语言简体中文 点击Gener…

第五章 路由技术及应用

目录 5.1 直连路由概述 5.1.1 直连路由工作原理 5.1.2 直连路由配置 5.2 直连路由仿真 5.3 静态路由技术 5.3.1 静态路由定义 5.3.2 静态路由工作原理 5.3.3 静态路由配置 5.3.4 默认路由 (1) 默认路由概述 (2) 配置默认路由 (3) 默认路由应用场合&#xff1a;上网…

基于springboot实现疫苗接种管理系统项目【项目源码】计算机毕业设计

基于springboot实现疫苗接种管理系统演示 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的…

3+差异分析+PPI+预后+实验的生信思路,简单直接容易上手

今天给同学们分享一篇生信文章“Identification of hub genes and pathways in lung metastatic colorectal cancer”&#xff0c;这篇文章发表在BMC Cancer期刊上&#xff0c;影响因子为3.8。 结果解读&#xff1a; 原发性和肺转移性CRC组织之间的差异表达基因的鉴定 使用在…

Spring Boot EasyPOI 使用指定模板导出Excel

相信大家都遇到过&#xff0c;用户提出要把界面上的数据导成一个Excel&#xff0c;还得是用户指定的Excel格式&#xff0c;用原生的POI&#xff0c;需要自己去实现&#xff0c;相信是比较麻烦的&#xff0c;所以我们可以使用开源的EasyPOI. 先上个图&#xff0c;看看是不是大家…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之进程管理2》(4)

《Linux操作系统原理分析之进程管理2》》&#xff08;4&#xff09; 3 进程管理3.5 P、V操作3.5.1 信号量3.5.2 信号量的应用3.5.3 进程同步机制 3.6 进程通信3.6.1 消息通信3.6.2 信箱通信 3.7 死锁3.7.1 死锁的定义3.7.2 死锁产生的必要条件3.7.3 死锁的预防3.7.4 死锁的避免…

如何使用Omniverse Kit开发元宇宙

最近我研究了一些潜在的元宇宙开发平台。尽管Facebook上个月引发了关于元宇宙的最新一轮炒作&#xff0c;但另一家公司英伟达&#xff08;Nvidia&#xff09;在开发实际元宇宙平台方面走得更远。Nvidia的Omniverse自2019年以来一直在运行&#xff0c;因此在今天的帖子中&#x…

vscode中Chinese (Simplified)汉化无效解决方法

问题复现 之前已经下载了 Chinese (Simplified)插件并启用了&#xff0c;都是正常的中文简体。有时候打开vscode的时候&#xff0c;会发现汉化失效了&#xff0c;如图&#xff1a; 解决方法 依次点击 扩展&#xff08;Extensions&#xff09;— Chinese (Simplified) — 选…

SpringBoot使用DevTools实现后端热部署

&#x1f4d1;前言 本文主要SpringBoot通过DevTools实现热部署的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&…

WorkPlus移动数字化平台,助力企业全面掌控业务和生态

在移动化的时代&#xff0c;企业面临着将业务和生态纳入数字化平台的挑战。WorkPlus作为一款安全专属的移动数字化平台&#xff0c;成为企业业务和生态全面掌控的有力助手。它如同一艘强大的“航空母舰”&#xff0c;助力企业实现全面发展&#xff0c;从业务到生态&#xff0c;…

Linux安装Docker完整教程

Linux安装Docker完整教程 1.卸载旧版本的Docker&#xff08;可选&#xff09;2.安装Docker&#xff08;1&#xff09;yun安装&#xff08;2&#xff09;离线安装 3.启动Docker4.配置镜像加速5.Docker拉取镜像命令 参考链接 https://blog.csdn.net/m0_59196543/article/details/…

9.基于SpringBoot3+MybatisPlus定制化代码生成器类

我们在3.基于SpringBoot3集成MybatisPlus中讲到自定义代码生成器&#xff0c;但是往往遗留代码生成的类格式或者命名不符合要求&#xff0c;需要手工修改&#xff0c;但是当表很多时就比较头痛,所以我们自定义模板在进行代码生成 1. 新建MyTemplateEngine.java类 里面大多实现…