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

网络编程

什么是计算机网络?

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

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

网络编程是干什么的?

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

  • 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.mzph.cn/news/204991.shtml

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

相关文章

GPT 中文提示词技巧:参照 OpenAI 官方教程

前言 搜了半天什么 prompt engineering 的课,最后会发现 gpt 官方其实是有 prompt 教程的。因此本文主要是学习这篇教程。 概述 - OpenAI API 部分案例是参考:根据吴恩达老师教程总结出中文版prompt教程_哔哩哔哩_bilibili up主的内容。 一、尽可能清…

JavaScript实现手写签名,可触屏手写,支持移动端与PC端双端保存

目录 1.HTML模板 2.获取DOM元素和定义变量 3.创建两个canvas元素,并设置它们的宽度和高度 4.绑定触摸事件:touchstart, touchmove, touchend和click 5.实现触摸事件回调函数:startDrawing, draw和stopDrawing 6.实现绘制线段的函数&…

刷题学习记录(文件上传)

[GXYCTF 2019]BabyUpload 知识点&#xff1a;文件上传.htaccessMIME绕过 题目直接给题目标签提示文件上传的类型 思路&#xff1a;先上传.htaccess文件&#xff0c;在上传木马文件&#xff0c;最后蚁剑连接 上传.htaccess文件 再上传一个没有<?的shell 但是要把image/pn…

基于Java SSM框架实现文物管理系统项目【项目源码+论文说明】

基于java的SSM框架实现文物管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…

java设计模式学习之【组合模式】

文章目录 引言组合模式简介定义与用途&#xff1a;实现方式UML 使用场景优势与劣势组合模式在Spring中的应用员工结构示例代码地址 引言 设想您正在组织一个大型派对&#xff0c;需要将各种食品和饮料按类型整理。您可能有单独的物品&#xff0c;如一瓶苏打水&#xff0c;也可…

Qt 如何使用VTK显示点云

开发环境 ubuntu 20.04 VTK 8.2 编译VTK 下载源码 git clone --recursive https://gitlab.kitware.com/vtk/vtk.git 使用版本管理工具&#xff0c;切换版本到8.2 更改编译选项&#xff0c;这里使用cmake-gui进行配置 1、编译类型修改为Release 2、安装路径可以设置&#xf…

JavaScript如何实现按键音效、视频播放,标签分类切换横向滚动

1.使用HTML5的audio标签 &#xff08;音频播放&#xff09; <audio id"click-sound"><source src"audio/show.mp3" type"audio/mpeg"> </audio> <button id"button">按钮</button> var clickSound d…

Vue练习 v-model 指令在状态和表单输入之间创建双向绑定

效果&#xff1a; <template><h2>Text Input</h2><input v-model"text"> {{ text }}<h2>Checkbox</h2><input type"checkbox" id"checkbox" v-model"checked"><label for"checkbox…

使用Notepad++编辑器,安装compare比较差异插件

概述 是一款非常有特色的编辑器&#xff0c;Notepad是开源软件&#xff0c;Notepad中文版可以免费使用。 操作步骤&#xff1a; 1、在工具栏 ->“插件”选项。 2、勾选Compare选项&#xff0c;点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装 6、打…

服务器配置免密SSH

在当今互联网时代&#xff0c;远程工作和网络安全已成为信息技术领域的热点话题。无论是管理远程服务器、维护网络设备还是简单地从家中连接到办公室&#xff0c;安全始终是首要考虑的因素。这就是为什么 SSH&#xff08;Secure Shell&#xff09;成为了网络专业人士的首选工具…

集合进阶指南:从基础知识到高级应用

集合高级 Collection集合 数组和集合的区别 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的数组可以存储基本数据类型和引用数据类型 集合只能存储引用数据类型,如果要存基本数据类型,需要存对应的包装类 集合类体系结构 Collectio…

家政预约小程序带商城,图文详解

家政预约小程序开发&#xff0c;在线选择服务分类&#xff0c;选择上门时间&#xff0c;提交订单&#xff0c;在线支付。 商城模块&#xff1a;商品分类&#xff0c;在线下单支付。 个人中心&#xff1a;订单管理&#xff08;家政订单&#xff0c;搬家订单&#xff0c;商品订…

antdesign前端一直加载不出来

antdesign前端一直加载不出来 报错&#xff1a;Module “./querystring” does not exist in container. while loading “./querystring” from webpack/container/reference/mf at mf-va_remoteEntry.js:751:11 解决方案&#xff1a;Error: Module “xxx“ does not exist …

肾虚的16个表现,你有吗?

现代研究发现&#xff1a;导致人体衰老的根本原因不是年龄&#xff0c;而是“肾虚”。此外&#xff0c;肾虚不是男人的专利&#xff0c;女人肾虚的危害更大。 一、肾虚的16个表现 1、总感觉口咸 我们的五味&#xff08;酸苦甘辛咸&#xff09;跟我们的脏腑是相对应的&#xf…

软件设计之装饰模式

装饰模式把每个要装饰的功能放在单独的类中&#xff0c;并让这个类包装它所要装饰的对象&#xff0c;因此&#xff0c;当需要执行特殊行为时&#xff0c;客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象。 案例&#xff1a;穿搭。衣柜有帽子、眼镜、…

由于找不到xinput1_3.dll,无法继续执行代码的多种解决方法指南,xinput1_3.dll文件修复

当玩家或用户在启动某些游戏和应用程序时&#xff0c;可能会遭遇到一个系统错误提示&#xff1a;“由于找不到xinput1_3.dll,无法继续执行代码l”。这种情况通常指出系统中DirectX组件存在问题。以下我们将介绍几种常用的解决方法&#xff0c;并提供详细的操作步骤。 一.找不到…

qt-C++笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString

qt-C笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString code review! 文章目录 qt-C笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString1.运行2.main.cpp3.qt_FileDialog.pro4.QFileDialog类详解 1.运行 2.main.cpp 代码 #inclu…

自己搭建一个window系统上的MinIO系统(小白30分钟搞得版)

自己搭建一个window系统上的MinIO系统 前言实现系统说明 效果配置结果测试本地测试同一网络内的其他计算机访问 展望注参考链接 前言 有个项目使用到minio的云端存储系统&#xff0c;为了更好的理解项目&#xff0c;准备对这个“神秘的玩意”自己研究一下&#xff0c;看看到底…

【hacker送书第10期】AI时代系列丛书(五选一)

AI时代系列丛书 AI时代程序员开发之道✨内容简介参与方式 AI时代项目经理成长之道✨内容简介参与方式 AI时代架构师修炼之道✨内容简介参与方式 AI时代产品经理升级之道✨内容简介参与方式 AI时代Python量化交易实战✨内容简介参与方式 AI时代程序员开发之道✨ 内容简介 本书是…