第五章 网络编程 TCP/UDP/Socket

devtools/2024/9/19 16:58:24/ 标签: 网络, tcp/ip, udp, 开发语言, java, 数据结构, 网络协议

第五章 网络编程

一、IP地址

java">唯一标识网络上的每一台计算机
32位,由48位二进制数组成

在这里插入图片描述

1.IP地址的组成

java">IP地址 = 网络地址 +主机地址
网络地址:标识计算机或网络设备所在的网段
主机地址:标识特定主机或网络设备A类地址通常分配给具有大量主机的网络使用A类地址:0.0.0.0---127.255.255.255B类地址通常分配给规模中等的网络使用  B类地址:128.0.0.0---191.255.255.255C类地址通常分配给小型局域网使用。C类地址:192.0.0.0---223.255.255.255

A/B/C/D/E类 地址的组成

在这里插入图片描述

java">查看本机的IP地址
ipconfig
测试网络是否通畅
ping  目标IP地址

二、DNS域名

java">访问网站时,为什么输入网址而不是IP地址1. 域名易于记忆
2. 域名与IP地址的动态绑定
网站的IP地址可能会随时改变,但域名不会改变。互联网服务提供商或网站管理员可以在后台更新IP地址,而用户只需继续访问相同的域名。
域名解析系统(DNS)充当了翻译器的角色。当用户在浏览器中输入域名时,DNS将该域名转换成实际的IP地址,从而帮助浏览器找到目标服务器。
3.负载均衡与多个IP地址
一个大型网站通常会使用多个服务器,每个服务器可能有不同的IP地址。通过一个域名
(如www.example.com),可以将用户请求动态地分配给多个服务器,以实现负载均衡,提升网站的响应速度和可靠性。如果用户直接输入IP地址,可能只访问其中一台服务器,影响了均衡分布的效果。

三、网络通信协议

在这里插入图片描述

简化后的五层协议

在这里插入图片描述

java">1.物理层: 基于电路特性的高低电压(电信号)  高电压代表1 低电压代表0
2.数据链路层:  定义电信号的分组方式
3.网络层: 引入一套新的地址来区分不同的广播域
4.传输层: 端口到端口的连接通信
5.应用层: (应用层,表示层,会话层) 规定了数据的传输格式 ftp/http/www
java">1. 局域网(LAN, Local Area Network)
特点:覆盖范围较小,通常在一个建筑物内或几百米范围内的网络。
用途:用于连接公司、学校、家庭等场所内的设备,以便实现资源共享、数据传输和通信。
示例:办公室内部的网络,家用Wi-Fi网络2. 城域网(MAN, Metropolitan Area Network)
特点:覆盖范围介于局域网和广域网之间,通常在一个城市范围内,连接多个局域网。
用途:用于连接城市中多个建筑物、企业、政府部门等,提供高速数据传输。
示例:一个城市的电信网络或大学校园网。
3. 广域网(WAN, Wide Area Network)
特点:覆盖范围广泛,通常在国家、洲际甚至全球范围内连接多个局域网和城域网。
用途:广泛用于跨城市、国家或国际的数据传输,互联网就是一种广域网。
示例:互联网,全球企业之间的数据通信网络4. 个人区域网(PAN, Personal Area Network)
特点:覆盖范围很小,通常在几米到十几米之间,用于个人设备之间的通信。
用途:用于个人设备(如智能手机、平板、耳机、手表等)之间的无线连接。
示例:蓝牙设备连接、手机热点。
5. 全球网(GAN, Global Area Network)
特点:覆盖全球范围,连接广域网的网络。其规模最大,涵盖地球范围内的网络。
用途:用于实现全球范围内的数据通信和信息传输。
示例:全球互联网服务供应商(ISP)构建的全球网络

四、Socket

TCP协议

三次握手,四次挥手

java">三次握手  建立通信A 客户端   B 服务器1.(A-->B)  携带syn 数据包AB 你可以收到我的信息嘛2.(B--A)   携带syn+ack数据包b回答A 可以收到3.(A-->B)  收到了可以开始通信了
java">四次挥手  断开联系1.(a-->b) 发送fin包 我要断开连接了2.(b-->a)   发送ack包 可以断开连接,进入断开等待状态3.(b--a)   发送fin包 我准备好了,可以断开链接了4.(a-->b)  发送ack包 A确定断开连接,发送数据包,b在接收到数据包时立刻断开连接,a进入超时等待状态,最后断开连接
java">是 Java 网络编程中的核心类之一,用于实现基于 TCP/IP 协议的网络通信。Socket 提供了客户端和服务器之间的双向通信功能。通过 Socket,客户端可以连接到服务器,双方可以交换数据。通信链路的端点就被称为“套接字”(英文名Socket)是提供给应用程序的接口

常用的包:

Socket

ServerSocket

DatagramPacket

DatagramSocket

InetAddress

1.Socket/ServerSocket

java">常用方法Socket 常用方法
socket():创建一个 Socketbind():将 Socket 绑定到本地的一个 IP 地址和端口。
listen():将 Socket 设置为监听模式,等待连接请求。
accept():接受客户端的连接请求。
connect():客户端用于连接到服务器。
send()recv():用于在客户端和服务器之间发送和接收数据。
close():关闭 Socket 连接
java">ServerSocketJava 网络编程中的一个类,专门用于 服务器端 的通信。它用于监听特定端口上的客户端连接请求,并在接收到连接时生成一个 Socket 对象,用于与客户端进行双向数据通信。ServerSocket 基于 TCP(传输控制协议),确保数据传输的可靠性和顺序性。

客户端和服务端tcp协议的案例

java">服务器端:创建一个 Socket,绑定到特定的 IP 地址和端口,并等待客户端连接。
客户端:创建 Socket,连接到服务器的 IP 地址和端口。
客户端和服务器通过输入输出流(InputStreamOutputStream)发送和接收数据。

客户端

java">package test01;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class User {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);Socket socket = null;try {// 创建 Socket 对象,连接到服务器的 IP 地址和端口socket = new Socket("localhost", 8080);//输入OutputStream out = socket.getOutputStream(); //输出流String a="你好,我要登录";
//            String a="我要登录账号,帮我查看一下";out.write(a.getBytes());//读取输入流InputStream in=socket.getInputStream();byte buffer[]=new byte[1024];in.read(buffer); // 读取数据String received = new String( buffer);System.out.println(received);} catch (Exception e) {e.printStackTrace();}}
}

服务器端

java">package test01;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class Servers {public static void main(String[] args) {try {Scanner scanner = new Scanner(System.in);// 创建 ServerSocket 对象,监听端口 8080ServerSocket serverSocket=new ServerSocket(8080);System.out.println("Server is listening on port 8080");//等待客户端连接Socket socket=serverSocket.accept();//获得输入信息InputStream in = socket.getInputStream();byte buffer[]=new byte[1024];int bytesRead = in.read(buffer); // 读取数据String received = new String(buffer ,0, bytesRead);System.out.println("用户发送内容:" + received);//给客户端发送信息OutputStream out = socket.getOutputStream();String a="马上";out.write(a.getBytes());} catch (Exception e) {e.printStackTrace();}}
}

2.DatagramPacket/DatagramSocket (UDP)

java">DatagramPacket:封装要发送或接收的数据包。
DatagramSocket:发送和接收 DatagramPacket 的套接字,用于建立 UDP 通信。
一、DatagramPacket
java">DatagramPacketJava 中用来存储发送或接收的数据包。UDP 通信中,数据是以独立的数据报(Datagram)的形式发送和接收的,每个数据报都使用 DatagramPacket 来封装。
接收:
DatagramPacket(byte[] buf, int length)
接收数据时,指定一个缓冲区 buf 和数据的长度 length。
发送:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
发送数据时,指定要发送的数据 buf、数据长度 length、目标地址 address 和端口号 port。
getData():返回数据报中的数据。
getLength():返回数据的实际长度。
getAddress():返回数据报的来源或目的地的 InetAddress 对象。
getPort():返回数据报的来源或目的地的端口号。
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("localhost"), 9876);
二、DatagramSocket
java">是用于发送和接收 DatagramPacket 的套接字。它实现了无连接的通信协议(UDP),即不需要建立连接即可发送和接收数据。
创建一个 UDP 套接字并绑定到指定端口:
DatagramSocket(int port)
//常用方法
send(DatagramPacket p):发送数据包 p。
receive(DatagramPacket p):接收数据包 p。
close():关闭套接字。
// 发送端
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("localhost");
String msg = "Hello, UDP!";
byte[] buffer = msg.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 12345);
socket.send(packet);
socket.close();

UDP发送信息案例

客户端

java">package test03;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class Customer {//客户public static void main(String[] args) {Scanner scanner = new Scanner(System.in);DatagramSocket socket=null;DatagramPacket packet=null;try {while (true){//发送的内容System.out.print("请输入");String news=scanner.next();byte[] buffer = news.getBytes();//转化为字节//字节数组  数组长度  IP地址 端口号packet = new DatagramPacket(buffer,buffer.length,InetAddress.getByName("localhost"),9876);//DatagramSocket 是用于发送和接收 DatagramPacket 的套接字。//创建发送对象socket = new DatagramSocket();socket.send(packet);System.out.println("发送内容:" + news);//接收信息byte[] buffer1 = new byte[1024];//创建一个空包去接收别人发送的信息packet= new DatagramPacket(buffer1, buffer1.length);socket.receive(packet);//读取内容,转化为字符串String received = new String(packet.getData(), 0, packet.getLength());System.out.println("客服答复: " + received);}} catch (Exception e) {e.printStackTrace();}finally {socket.close();//关闭}}
}

服务器端

java">package test03;
import java.net.*;
import java.util.Scanner;
public class customerService {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//接收方DatagramSocket socket=null;DatagramPacket packet=null;try {//接收信息socket = new DatagramSocket(9876);while (true){//放入数组byte[] buffer = new byte[256];//包接收packet = new DatagramPacket(buffer, buffer.length);socket.receive(packet);//读取内容,转化为字符串String received = new String(packet.getData(), 0, packet.getLength());System.out.println("客户发送内容:" + received);//发送信息System.out.print("请输入");String news=scanner.next();byte[] buffer2 = news.getBytes();//转化为字节//于从接收到的 DatagramPacket 中获取客户端的 IP 地址///这个方法用于获取发送该数据包的客户端的 端口号SocketAddress socketAddress = packet.getSocketAddress();packet = new DatagramPacket(buffer2, buffer2.length, socketAddress);socket.send(packet);//发送System.out.println("客服发送内容:" + news);}} catch (Exception e) {e.printStackTrace();}finally {socket.close();//关闭}}
}

3.InetAddress

java">InetAddress 类表示 IP 地址,它负责表示一个 IP 地址(IPv4IPv6),并提供方法来查询和操作 IP 地址信息。
常用方法:
getByName(String host):根据主机名或 IP 地址字符串返回一个 InetAddress 对象。
getLocalHost():返回本地主机的 InetAddressgetHostAddress():返回主机的 IP 地址的字符串表示。
getHostName():返回主机名。

http://www.ppmy.cn/devtools/114196.html

相关文章

汽车软件开发之敏捷开发

一、前言 目前汽车电子产品,特别是汽车几大域控(如:智能座舱、智能驾驶、智能网联、车身控制)市场竞争激烈,消费者对汽车的需求逐渐多元化和个性化,用户对座舱和智驾产品的要求也越来越高。他们不仅要求产…

在 Windows 上恢复已删除的 PDF 文件的最佳方法

如果您不小心删除了 PDF 文件或由于系统突然崩溃而无法再找到它们,本指南介绍了恢复已删除文件的最佳方法。 帖子中列出的方法简单、有效且可行。我们在列出它们之前对其进行了测试。 什么是 PDF,Adobe 将未保存的 PDF 存储在哪里? 自从 Ad…

家居小程序有什么用?

家居小程序在现代家居生活中扮演着越来越重要的角色,其功能和用途广泛且实用。以下是家居小程序的主要用途: 一、商品展示与购物 商品展示:家居小程序可以展示各种家居产品,包括家具、家电、装饰品等,用户可以通过分类…

【Linux下的cpp】编译调试(gcc、g++、gdb)

【Linux下的cpp】编译调试(gcc、g、gdb) 文章目录 【Linux下的cpp】编译调试(gcc、g、gdb)简述gcc、g、gdb编译过程g 编译参数命令行编译演练1、直接编译2、生成库文件并编译链接静态库并生成可执行文件链接动态库生成可执行文件 …

鸿蒙Harmony应用开发,数据驾驶舱页面的实现

先来看看我们要实现的驾驶舱的页面是什么样的 对于这种 响应式布局的页面构建,我们的脑子里面要有一个概念,就是"分而治之"。我们把这个页面进行分割,分割成不同的块然后再来逐个实现. 不难发现,我们可以将这个看到的效…

json格式互相转换

您提供的字符串已经是一个JSON格式的字符串,但是JSON标准要求键名必须用双引号括起来,而不是单引号。因此,您需要将字符串中的单引号替换为双引号。以下是转换后的JSON字符串: {"图片描述": "高速公路上发生了严重…

基于Spring Boot的学生社区故障维修预约系统的设计与实现(开题报告)

毕业论文(设计)开题报告 基于Spring Boot的学生社区故障维修预约系统设计与实现 姓 名 学 院 数学与数据科学学院 专业班级 信息与计算科学202 学 号 202021314223 校内指导教师 职称/职务 副教授 校外指导教师 职称/职务 技术经理 起始时间 2023年9月 教务部制 一、开…

go语言中的数组指针和指针数组的区别详解

1.介绍 大家知道C语言之所以强大,就是因为c语言支持指针,而且权限特别大,c语言可以对计算机中任何内存的指针进行操作,这样自然而然也会带来一些不安全的因素,所以在golang中,「取消了对指针的一些偏移&…

Day.js时间插件的安装引用与常用方法大全

🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

给一个web网站,如何开展测试?

前言 Web测试是指针对Web应用程序(网站或基于Web的系统)进行的测试活动,以确保其质量、性能、安全性、可用性和兼容性等方面符合预期标准。Web测试涵盖了从前端用户界面(UI)到后端逻辑和数据库的各个方面,确保Web应用程序在不同环境和条件下都能正常运行…

【算法】队列与BFS

【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)N 叉树的层序遍历 .1- 题目解析 .2- 代码编写 2)二叉树的锯齿形层序遍历 .1- 题目解析 .2- 代码编写 3)二叉树最大宽度 .1- 题目解析 .2- 代码编写 4&#xf…

nanoGPT用红楼梦数据从头训练babyGPT-12.32M实现任意问答

1. 引入 大神karpathy从openai离职后,创办了AI教育公司Eureka Labs(参考1),同时也创办了知名的nanoGPT项目。 目前,使用nanoGPT(参考2),你可以在几分钟内训练出一个babyGPT&#xf…

python如何实现堆栈

栈的特点是后进先出,最先进入栈的数据放到栈底,最后一个出来,而最后进的数据反而有机会先出来。 python实现栈的思路是如果要在栈里添加元素,直接用append添加元素就可以了,直接在列表末位添加。从栈中取出元素&#…

python 虚拟环境多种创建方式

【一】说明介绍 (1)什么是虚拟环境 在Python中,虚拟环境(Virtual Environment)是一个独立的、隔离的Python运行环境,它拥有自己的Python解释器、第三方库和应用程序。通过创建虚拟环境,可以确…

【数据结构】排序算法---冒泡排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 1. 定义 冒泡排序(英语:Bubble sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的…

letterSpacing导致TextView文本被截断

一.背景介绍 (Android10 11目前有这个问题 Android15似乎有新的属性 但是没有可用的环境 没有验证) 简介 android:maxLines"1" android:textAlignment"viewStart" android:letterSpacing"0.04" 多个属性同时作用情况下 …

python学习第十节:爬虫基于requests库的方法

python学习第十节:爬虫基于requests库的方法 requests模块的作用: 发送http请求,获取响应数据,requests 库是一个原生的 HTTP 库,比 urllib 库更为容易使用。requests 库发送原生的 HTTP 1.1 请求,无需手动…

门磁模块详解(防盗感应开关 STM32)

目录 一、介绍 二、程序设计 main.c文件 gate_guard.h文件 gate_guard.c文件 三、实验效果 四、资料获取 项目分享 一、介绍 MC-38常闭式门磁开关是作为IO开关输入数字信号的,原理是合在一起信号是导通的 , 配合有线主机使用 不能单独使用。适用于非铁质&a…

蓝桥杯1.确定字符串是否包含唯一字符

插播一句,博主转学python了,来写写算法题,若掌握好会考虑捐300块。 题目: 题目描述 实现一个算法来识别一个字符串的字符是否是唯一的(忽略字母大小写)。 若唯一,则输出YES,否则…

智能指针

1. 为什么需要智能指针? 下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题。 因为div抛异常后会跳过delete,导致内存泄漏 int div() {int a, b;cin >> a >> b;if …