Java网络编程 *TCP与UDP协议*

news2024/11/19 23:38:23

网络编程

什么是计算机网络?

  • 把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统

简单来说就是把不同地区的计算机通过设备连接起来,实现不同地区之前的数据传输

网络编程是干什么的?

  • 网络编程是借助计算机网络,实现我们所写的程序,在不同电脑上,可进行数据的传输

  • java是支持网络间的数据传输的,降低层细节封装起来了,给程序员提供了一套标准的类库很方便使用java语言开发可以进行网络通信的软件

  • 网络编程的核心问题

    • ​ 如何找到网络世界中的恶目标主机,以及目标软件

    • ​ 在终端 使用 ipconfig 指令查看ip

    • ​ 如何安全可靠的进行数据传输 协议 规则

网络的一些基本知识

  • 网络模型
  • ​ OSI参考模型 是一个理想化的标准模型
    • ​ 分成七层
  • ​ TCP/IP参考模型
    • ​ 分成四层
    • ​ 应用层(http)
    • ​ 运输层(协议)
    • ​ 网络层(ip)
    • ​ 物理链路层(硬件设备)

如下:

image-20231022180449559

image-20231022180529233

  • 通信要素 ip 端口 协议
    • IP:在网络世界中,是计算机的地址
    • 局域网地址: 192.168.1.20 连接到路由器,会自动分配IP
    • 广域网地址: 家里的宽带 与外界连接
    • 本机地址: 本地回环地址 127.0.0.1
    • 端口:计算机中运行中的程序的编号,对应的是程序
      • 端口号0-65535之间 由于0-1024被一些系统程序使用,所以我们开发的程序可以从
        1024-655335区设定端口,但是不能与已有的发生冲突
    • ip+端口 找到目标计算机 以及你想要的程序

image-20231022180547107

如何进行安全信息传输–传输协议

  • Java中分为两种编程协议
    • TCP
    • UDP
TCP协议通信原理

先检测网络是否通畅,客户端是否能连接到服务器端
如果能连接到,则进行数据的传输,如果连接不到,就会报错
采用3次握手的机制 (连接请求)
1.第一次客户端给服务器发送一个信息
2.服务器收到客户端的请求后,需要给客户端做出一个反馈(表示服务器端收到客户端消息)
3.客户端收到服务器端确认反馈后,再一次向服务器发送一个反馈,以确保服务器知道他的
反馈,客户端是收到 (表示客户端成功收到服务器端消息)

TCP是可靠的安全的,相对于UDP效率低

image-20231023224832805

四次挥手(端来请求)

  • 1.客户端 向服务器端发送一个断开请求
  • 2.服务器端 向客服发出一个反馈
  • 3.服务器端把没有发完的数据全部发送
  • 4.客户端再向服务器端发送最终断开的信号

image-20231023225803452

UDP协议通信原理
  • ​ 将数据分装成一个一个数据报
  • ​ 包含 数据 源(自己电脑ip) 目标(接受ip 端口)
  • ​ 只管发送 是否成功,不知道
  • ​ 是不安全的,但是效率高

不用建立连接,直接发送

image-20231207193831271

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(用户数据报协议)都是网络传输层协议,用于在网络中传输数据。它们之间的主要区别在于连接方式可靠性数据流方式功能

  1. 连接方式
    • TCP是面向连接的协议,发送方和接收方在发送数据之前,必须通过三次握手建立连接。这个过程确保了双方都已准备好进行数据传输。
    • UDP是无连接的协议,发送方在向接收方发送数据时不需要建立连接。这意味着UDP可以更快地发送数据,但也可能导致数据的丢失或乱序。
  2. 可靠性
    • TCP通过序号机制、确认机制、超时重传机制和数据校验来保证传输的可靠性。如果数据在传输过程中丢失或损坏,TCP会重新发送数据,直到接收方成功接收为止。
    • UDP只添加了端口和差错检查的功能,不提供数据的可靠性保证。因此,UDP在传输过程中可能会出现数据丢失或乱序的情况。
  3. 数据流方式
    • TCP是面向字节流的协议,将应用层传递下来的数据当做无结构的数据流进行处理。TCP不知道所传数据的具体含义,只是将数据块拼接成一个段进行发送。
    • UDP是面向报文的协议,发送方的UDP对应用程序交下来的报文添加首部后直接向下交付IP层。每个报文都是独立发送的,不需要进行拼接。
  4. 功能
    • TCP支持单播、多播和广播的功能,可以实现一对一、一对多、多对多和多对一的数据传输。
    • UDP同样支持这些传输方式,但由于其无连接的特性,使得UDP在实时性要求较高的场景中更为适用,如视频流、音频流等。

tcp_udp1

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyTorch】 暂退法(dropout)

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 主要代码2.2.2. 完整代码2.2.3. 输出结果 1. 理论介绍 线性模型泛化的可靠性是有代价的,因为线性模型没有考虑到特征之间的交互作用,由此模型灵活性受限。泛化性和灵活性之间的基本权…

JavaSE基础50题:20. 创建一个int类型的数组,元素为100,并把每个元素依次设置为1 - 100

概述 数组练习题 创建一个int类型的数组,元素为100,并把每个元素依次设置为1 - 100. 代码 public static void main(String[] args) {int[] array new int[100]; //没有赋值的情况下&#xff0c;里面存的是100个0//获取数组的长度,依次赋值for (int i 0; i < array.len…

P1 Qt的认识及环境配置

目录 前言 01 下载Qt Creator windows下载安装包拷贝到Linux Linux直接下载 02 Linux 安装Qt 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类…

HarmonyOS4.0开发应用(三)【ArkUI组件使用】

ArkUI组件使用 这里会详细演示以下组件使用: ImageTextTextInputButtonSliderColumn&&RowList自定义组件以及相关函数使用 Image 可以是网络图片、可以是本地图片、也可以是像素图 Image("https://ts1.cn.mm.bing.net/th?idOIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&…

查看电脑cuda版本

1.找到NVODIA控制面板 输入NVIDIA搜索即可 出现NVIDIA控制面板 点击系统信息 2.WINR 输入nvidia-smi 检查了一下&#xff0c;电脑没用过GPU&#xff0c;连驱动都没有 所以&#xff0c;装驱动…… 选版本&#xff0c;下载 下载后双击打开安装 重新输入nvidia-smi 显示如下…

【Lidar】Python实现点云CSF布料滤波算法提取地面点

这两天会持续更新一下Python处理点云数据的教程&#xff0c;大家可以点个关注。今天给大家分享一下点云的经典算法&#xff1a;CSF布料模拟算法。 1 CSF算法简介 CSF算法&#xff0c;全称为Cloth Simulation Filtering&#xff0c;是一种基于欧几里得空间中最小生成树思想的聚类…

iPaaS架构深入探讨

在数字化时代全面来临之际&#xff0c;企业正面临着前所未有的挑战与机遇。技术的迅猛发展与数字化转型正在彻底颠覆各行各业的格局&#xff0c;不断推动着企业迈向新的前程。然而&#xff0c;这一数字化时代亦衍生出一系列复杂而深奥的难题&#xff1a;各异系统之间数据孤岛、…

生成式人工智能在采购场景落地 隆道AI产品亮相甲子引力年终盛典

11月30日&#xff0c;以“致追风赶月的你”为主题的“2023甲子引力年终盛典”在北京举办。北京隆道网络科技有限公司总裁吴树贵受邀出席本次会议&#xff0c;并在企业数字化专场会议中做主题发言&#xff0c;探讨了人工智能在采购业务场景中的应用&#xff0c;重点向参会人员介…

老电脑重置后能连上WIFI但是打开360网页老是提示该网址不是私密连接

看了一下可以忽略这次提示&#xff0c;能够上网&#xff0c;但是每次打开新网页都会有“该网址不是私密连接”提示&#xff0c;这个提示非常大&#xff0c;严重影响上网。 强行下载了谷歌浏览器并打开后&#xff0c;提示“您的时钟慢了”&#xff0c;然后看了一下电脑右下角日期…

UDP实现群聊

代码&#xff1a; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String;public class liaotian extends JFrame{private static final int DEFAULT_PORT8899;private JLabel stateLB…

JAVA实现敏感词高亮或打码过滤:sensitive-word

练手项目中实现发表文章时检测文章是否带有敏感词&#xff0c;以及对所有敏感词的一键过滤功能 文章目录 效果预览实现步骤 效果预览 随便复制一篇内容到输入框 机器审核文章存在敏感词&#xff0c;弹消息提示并进入人工审核阶段&#xff08;若机器审核通过&#xff0c;则无需审…

helm或者k8s部署pod时遇到pod一直处于pending状态

问题 我在使用helm部署一个mysql主从复制的数据库时遇到了一些问题&#xff0c;具体如下&#xff1a; 这是我使用的配置文件 # ruoyi-mysql.yaml auth:rootPassword: "123456"database: ry-vueinitdbScriptsConfigMap: ruoyi-init-sqlprimary:persistence:size: 2G…

CleanMyMac X2024最新版本软件实用性测评

信大多数MAC用户都较为了解&#xff0c;Mac虽然有着许多亮点的性能&#xff0c;但是让用户叫苦不迭的还其硬盘空间小的特色&#xff0c;至于很多人因为文件堆积以及软件缓存等&#xff0c;造成系统空间内存不够使用的情况。于是清理工具就成为了大多数MAC用户使用频率较高的实用…

使用Caliper对Fabric地basic链码进行性能测试

如果你需要对fabric网络中地合约进行吞吐量、延迟等性能进行评估&#xff0c;可以使用Caliper来实现&#xff0c;会返回给你一份网页版的直观测试报告。下面是对test-network网络地basic链码地测试过程。 目录 1. 建立caliper-workspace文件夹2. 安装npm等3. calipe安装4. 创建…

[wp]“古剑山”第一届全国大学生网络攻防大赛 Web部分wp

“古剑山”第一届全国大学生网络攻防大赛 群友说是原题杯 哈哈哈哈 我也不懂 我比赛打的少 Web Web | unse 源码&#xff1a; <?phpinclude("./test.php");if(isset($_GET[fun])){if(justafun($_GET[fun])){include($_GET[fun]);}}else{unserialize($_GET[…

Rust的eBFP框架Aya(一) - Linux内核网络基础

前言 在我的Rust入门及实战系列文章中已经说明&#xff0c; Rust是一门内存安全的高性能编程语言&#xff0c;从它的这些优秀特性来看&#xff0c;就是一门专为系统开发而诞生的语言。至于很多使用Rust来进行web开发的行为&#xff0c;不能说它们不好&#xff0c;只能说是杀鸡…

CPU密集型和IO密集型与CPU内核之间的关系

CPU密集型和IO密集型与CPU内核之间的关系 一、CPU密集型 介绍 CPU密集型&#xff0c;也叫计算密集型&#xff0c;是指需要大量CPU计算资源&#xff0c;例如大量的数学运算、图像处理、加密解密等。这种类型的任务主要依赖于CPU的计算能力&#xff0c;会占用大量的CPU时间片&am…

ALNS的MDP模型| 还没整理完12-08

有好几篇论文已经这样做了&#xff0c;先摆出一篇&#xff0c;然后再慢慢更新 第一篇 该篇论文提出了一种称为深增强ALNS&#xff08;DR-ALNS&#xff09;的方法&#xff0c;它利用DRL选择最有效的破坏和修复运营商&#xff0c;配置破坏严重性参数施加在破坏算子上&#xff0c…

备忘录模式 rust和java的实现

文章目录 备忘录模式介绍实现javarustrust仓库 备忘录模式 备忘录&#xff08;Memento&#xff09;模式的定义&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便以后当需要时能将该对象恢复到原先…

解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app

错误场景 更新了IOS的系统版本为最新的17.0, 运行报以下错误 Launching lib/main.dart on iPhone in debug mode... Automatically signing iOS for device deployment using specified development team in Xcode project: GN3DCAF71C Running Xcode build... Xcode build d…