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++ 指针进阶
目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
