Java网络编程 *TCP与UDP协议*
网络编程
什么是计算机网络?
- 把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统
简单来说就是把不同地区的计算机通过设备连接起来,实现不同地区之前的数据传输
网络编程是干什么的?
-
网络编程
是借助计算机网络,实现我们所写的程序,在不同电脑上,可进行数据的传输 -
java
是支持网络间的数据传输的,降低层细节封装起来了,给程序员提供了一套标准的类库很方便使用java语言开发可以进行网络通信的软件 -
网络编程的核心问题
-
如何找到网络世界中的恶目标主机,以及目标软件
-
在终端 使用 ipconfig 指令查看ip
-
如何安全可靠的进行数据传输 协议 规则
-
网络的一些基本知识
- 网络模型
- OSI参考模型 是一个理想化的标准模型
- 分成七层
- TCP/IP参考模型
- 分成四层
- 应用层(http)
- 运输层(协议)
- 网络层(ip)
- 物理链路层(硬件设备)
如下:
- 通信要素 ip 端口 协议
IP
:在网络世界中,是计算机的地址-
局域网地址
:192.168.1.20
连接到路由器,会自动分配IP
-
广域网地址
: 家里的宽带 与外界连接 -
本机地址
: 本地回环地址127.0.0.1
端口
:计算机中运行中的程序的编号,对应的是程序- 端口号0-65535之间 由于0-1024被一些系统程序使用,所以我们开发的程序可以从
1024-655335区设定端口,但是不能与已有的发生冲突
- 端口号0-65535之间 由于0-1024被一些系统程序使用,所以我们开发的程序可以从
ip+端口
找到目标计算机 以及你想要的程序
如何进行安全信息传输–传输协议
- Java中分为两种编程协议
- TCP
- UDP
TCP协议通信原理
先检测网络是否通畅,客户端是否能连接到服务器端
如果能连接到,则进行数据的传输,如果连接不到,就会报错
采用3次握手的机制 (连接请求)
1.第一次客户端给服务器发送一个信息
2.服务器收到客户端的请求后,需要给客户端做出一个反馈(表示服务器端收到客户端消息)
3.客户端收到服务器端确认反馈后,再一次向服务器发送一个反馈,以确保服务器知道他的
反馈,客户端是收到 (表示客户端成功收到服务器端消息)
TCP是可靠的安全的,相对于UDP效率低
四次挥手(端来请求)
- 1.客户端 向服务器端发送一个断开请求
- 2.服务器端 向客服发出一个反馈
- 3.服务器端把没有发完的数据全部发送
- 4.客户端再向服务器端发送最终断开的信号
UDP协议通信原理
- 将数据分装成一个一个数据报
- 包含 数据 源(自己电脑ip) 目标(接受ip 端口)
- 只管发送 是否成功,不知道
- 是不安全的,但是效率高
不用建立连接,直接发送
TCP编程
服务端
ServerSocket
常用的方法
Socket accept() throws IOException
- 等待客户端的连接请求,返回与该客户端进行通信的Socket对象
void close() throws IOException
- 关闭监听Socket
package day15;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/*
服务器端*/
public class Server {public static void main(String[] args) {//创建并启动服务器try{ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务器启动成功");while(true) {Socket socket = serverSocket.accept();//监听有没有客户端连接到服务器,监听时,会阻塞程序System.out.println("有傻逼端连接到服务器");//接收客户端发送的数据InputStream inputStream = socket.getInputStream();//下面过于复杂,可以调用DataInputStream 但是必须对应DataOutputStream
// byte[] bytes = new byte[100];
// int size = inputStream.read(bytes);
// String s = new String(bytes, 0, size);
// System.out.println(s);DataInputStream dataInputStream = new DataInputStream(inputStream);String s= dataInputStream.readUTF();System.out.println(s);//服务器向客户端发送消息OutputStream outputStream =socket.getOutputStream();DataOutputStream dataOutputStream = new DataOutputStream(outputStream);dataOutputStream.writeUTF("已经收到");// 确保数据被发送出去,并释放资源dataOutputStream.flush();dataOutputStream.close();socket.close();}} catch (IOException e) {e.printStackTrace();System.out.println("服务器启动失败,端口被占用");}}
}
客户端
常用方法
void close() throws IOException
- 关闭Socket 不可以在以后得网络连接中使用 除非创建新的套接字
InputStream getInputStream() throws IOException
- 获取与Socket相关联的字节输入流,用于从Socket中读入数据
OutputStream getOutputStream() throws IOException
- 获取与Socket相关联的字节输出流 ,用于向Socket中写入数据
package day15;
import java.io.*;
import java.net.Socket;
/*
客户端*/
public class Client {public static void main(String[] args) {//创建客户端//127.0.0.1自己地址try {//向服务器发送Socket socket = new Socket("127.0.0.1", 9999);//在客户端向服务器端发送一句话OutputStream outputStream = socket.getOutputStream();//获取输出流DataOutputStream dataOutputStream =new DataOutputStream(outputStream);String s = "你好";dataOutputStream.writeUTF(s);//接受服务器InputStream inputStream = socket.getInputStream();DataInputStream dataInputStream = new DataInputStream(inputStream);System.out.println(dataInputStream.readUTF());} catch (IOException e) {e.printStackTrace();System.out.println("连接服务器失败");}}
}
UDP编程
服务端
package day16;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UDPReceive {public static void main(String[] args) {try {while(true){//接受数据的对象DatagramSocket datagramSocket = new DatagramSocket(9999);byte[] bytes = new byte[100];//接受数据包DatagramPacket datagramPacket = new DatagramPacket(bytes,0, bytes.length);datagramSocket.receive(datagramPacket);String s = new String(bytes,0,datagramPacket.getLength());System.out.println(s);datagramSocket.close();}} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
客户端
package day16;import java.io.IOException;
import java.net.*;//发送端
public class UDPSendDemo {public static void main(String[] args) {try {DatagramSocket datagramSocket = new DatagramSocket();//负责发送数据报byte[] bytes = "你好sb邓钦文".getBytes();DatagramPacket datagramPacket = new DatagramPacket(bytes,0, bytes.length, InetAddress.getByName("127.0.0.1"),9999);//发送(datagramSocket方法)datagramSocket.send(datagramPacket);datagramSocket.close();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
TCP 与 UDP的区别
TCP
(传输控制协议)和UDP
(用户数据报协议)都是网络传输层协议,用于在网络中传输数据。它们之间的主要区别在于连接方式
、可靠性
、数据流方式
和功能
。
- 连接方式:
TCP
是面向连接的协议,发送方和接收方在发送数据之前,必须通过三次握手建立连接。这个过程确保了双方都已准备好进行数据传输。UDP
是无连接的协议,发送方在向接收方发送数据时不需要建立连接。这意味着UDP
可以更快地发送数据,但也可能导致数据的丢失或乱序。
- 可靠性:
TCP
通过序号机制、确认机制、超时重传机制和数据校验来保证传输的可靠性。如果数据在传输过程中丢失或损坏,TCP
会重新发送数据,直到接收方成功接收为止。UDP
只添加了端口和差错检查的功能,不提供数据的可靠性保证。因此,UDP
在传输过程中可能会出现数据丢失或乱序的情况。
- 数据流方式:
TCP
是面向字节流的协议,将应用层传递下来的数据当做无结构的数据流进行处理。TCP
不知道所传数据的具体含义,只是将数据块拼接成一个段进行发送。UDP
是面向报文的协议,发送方的UDP
对应用程序交下来的报文添加首部后直接向下交付IP层。每个报文都是独立发送的,不需要进行拼接。
- 功能:
TCP
支持单播、多播和广播的功能,可以实现一对一、一对多、多对多和多对一的数据传输。UDP
同样支持这些传输方式,但由于其无连接的特性,使得UDP在实时性要求较高的场景中更为适用,如视频流、音频流等。
相关文章:

Java网络编程 *TCP与UDP协议*
网络编程 什么是计算机网络? 把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统 简单来说就是把不同地区的计算机通过设备连接起来,实现不同地区之前的数据传输 网络编程是干什么的? 网络…...

校园外卖小程序源码系统 附带完整的搭建教程
随着大学生消费水平的提高,对于外卖服务的需求也在不断增加。很多学生都面临着课业繁重、时间紧张等问题,无法亲自到餐厅就餐。因此,开发一款适合校园外卖市场的应用软件,将为广大学生提供极大的便利。 以下是部分代码示例&#…...

TiDB专题---1、TiDB简介和特性
什么是TiDB TiDB 是一个分布式 NewSQL 数据库,它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB 是 PingCAP 公司自主设计、研发…...
如何二次封装一个Vue3组件库?
为什么要二次封装组件库 目前开源的Vue3组件库有很多,包括Element Plus、Ant Design Vue、Naive UI、Vuetify、Varlet等等。 在大部分场景中,我们直接使用现有组件库中的组件即可实现功能。如果遇到部分组件的特殊配置或者特殊逻辑,或者当前…...

2024年网络安全比赛--系统渗透测试(超详细)
一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.在渗透机中对服务器主机进行信息收集,将服务器开启的端口号作为 Flag 值提交; 2.在渗透机中对服务器主机进行渗透,在服务器主机中获取服务器主机名称ÿ…...
高效的单行python脚本
#-- coding: utf-8 -- “”" Created on Wed Dec 6 13:42:00 2023 author: czliu “”" 1. 平方列表推导 #使用列表推导法计算从 1 到 10 的数字平方 squares [x**2 for x in range(1, 11)] print(squares)2.求偶数 #可以使用列表推导式从列表中筛选偶数。还可以…...

如何通过内网穿透实现无公网IP也能远程访问内网的宝塔面板
文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具,适合新手,简单好用。当我们在家里/公司搭建了宝塔,没有公网IP,但是想要在外也可以访问内…...

【广州华锐互动】VR沉浸式体验铝厂安全事故让伤害教育更加深刻
随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,为我们的生活带来了前所未有的便捷和体验。在安全生产领域,VR技术的应用也日益受到重视。 VR公司广州华锐互动就开发了多款VR安全事故体验系统,…...
CFLAGS、CXXFLAGS、FFLAGS、FCFLAGS、LDFLAGS、LD_LIBRARY_PATH区别
这些环境变量在编译和链接过程中扮演着重要的角色。下面是对每个环境变量的详细说明及示例: CFLAGS:用于设置C编译器的编译选项。 示例:将优化级别设置为最高,启用所有警告信息,并指定目标体系结构为x86-64。 export C…...

阿里云租赁费用_阿里云服务器多配置报价表
阿里云服务器租用费用,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年87元,2核4G4M带宽轻量服务器一年165元12个月,ECS云服务器e系列2核2G配置99元一年、2核4G配置365元一年、2核8G配置522元一年…...

网络层(1)——概述
一、概述 网络层毫无疑问是最复杂的一层,涉及到大量的协议与结构的内容。在如今主流的设计中,大家都会把网络层分成两个部分:数据平面、控制平面。其中数据平面指的是网络层中每台路由器的功能,它决定了到达路由器端口输入链路之一…...
计算机网络——网络层
目录 一、网络层的作用 二、网络层的协议 (一)ARP地址解析协议 (二)ICMP国际控制报文协议 (三)IGMP网际组织管理协议 三、ip地址 (一)ip地址的概念 (二ÿ…...
Antd search input无中框
发现input.search, 搜索图标的左侧有个竖线,不是很好看 把它改掉, 新建一个自己的CSS .custom-search-input{.ant-input-affix-wrapper{border-right: none !important;}.ant-input-group-addon{.ant-btn{border-left: none !important;}}}应用 <S…...
【PyTorch】概述
文章目录 1. PyTorch是什么?2. PyTorch的特点3. PyTorch的架构 1. PyTorch是什么? PyTorch是一个深度学习框架,由Facebook于2016年开源发布。PyTorch是基于Torch框架的Python接口,旨在提供易用的强大工具来进行神经网络的构建和训…...
非对象集合交、并、差处理
对于集合取交集、并集的处理其实有很多种方式,这里就介绍3种 第一种 是CollectionUtils工具类 第二种 是List自带方法 第三种 是JDK1.8 stream 新特性 1、CollectionUtils工具类 下面对于基本数据(包扩String)类型中的集合进行demo示例。 public static void main(String[]…...

时间序列预测实战(二十五)PyTorch实现Seq2Seq进行多元和单元预测(附代码+数据集+完整解析)
一、本文介绍 本文给大家带来的时间序列模型是Seq2Seq,这个概念相信大家都不陌生了,网上的讲解已经满天飞了,但是本文给大家带来的是我在Seq2Seq思想上开发的一个模型和新的架构,架构前面的文章已经说过很多次了,其是…...

电子学会C/C++编程等级考试2022年09月(三级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:课程冲突 小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。 定义两门课程的冲突程度为 : 有几天是这两门课程都要上的。 例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。 现在你需要求的是这 n 门课…...

【数据库】基于时间戳的并发访问控制,乐观模式,时间戳替代形式及存在的问题,与封锁模式的对比
使用时间戳的并发控制 专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会…...

Python 日志(略讲)
日志操作 日志输出: # 输出日志信息 logging.debug("调试级别日志") logging.info("信息级别日志") logging.warning("警告级别日志") logging.error("错误级别日志") logging.critical("严重级别日志")级别设置…...

C++ 指针进阶
目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...