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++ 指针进阶
目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
