【网络通信三要素】TCP与UDP快速入门

news2025/1/12 21:10:04

网络通信三要素

1.什么是网络编程?

可以让设备中的程序,与网络上其他设备中的程序进行数据交互,从而实现网络通信的手段,java.net.*包下提供了网络编程的解决方案

2.基本的通信架构

基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端),无论是CS架构,还是BS架构的软件都必须依赖网络编程
在这里插入图片描述
在这里插入图片描述

3.网络通信三要素
  • IP:设备在网络中的地址,是唯一的标识

    IP(Internet Protocol),全称"互联网协议地址",也称"IP地址",是分配给上网设备的数字标签常见的IP分类为IPv4和IPv6

    IPv4是4个字节,32个bit位,点分十进制表示法;IPv6

    lIPv6:由128bit位(16个字节)组成,号称可以为地球每一粒沙子编号,IPv6分为8组,每组的每四位编码成一个十六进制位表示, 冒分十六进制表示法

    特殊的IP地址:127.0.0.1、localhost:代表本机IP,只会寻找当前所在的主机

    IP常用命令

    • ipconfig:查看本机IP地址
    • lping IP地址:检查网络是否连通

    InetAddress:该类对象代表ip地址

    InetAddress的常用方法如下:

    • public static InetAddress getLocalHost:获取本机IP,会以一个 InetAddress的对象返回
    • public static InetAddress getByName(String host):根据ip地址或者域名,返回一个 InetAddress对象
    • public String getHostName():获取ip地址对象对应的主机名
    • public String getHostAddress():获取ip地址对象中的ip地址信息
    • public boolean isReachable(int timeout):在指定毫秒内,判断主机与该ip对应的主机是否能连通
  • 端口:应用程序在设备中的唯一标识,用两个字节表示,范围是0到65535

    分类

    • 周知端口:0-1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)
    • 注册端口:1024-49151,分配给用户进程或某些应用程序
    • 动态端口:49152-65535,之所以被称为动态端口,49152-65535,一般不固定分配给某进程,而是动态分配

    注意:开发程序一般使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错

  • 协议:连接和数据在网络中的传输规则

    传输层有两个通信协议:UDP(User Datagram Protocol)用户数据包协议;TCP(Transmission Control Protocol)传输控制协议

    UDP协议

    (1)特点:面向无连接,不可靠通信,通信效率高

    (2)不事先建立连接,数据包包含自己的ip、程序端口、目的地ip、程序端口和数据(64k)等

    (3)发送方不管对方是否在线,数据在路上丢不丢失,接收方收到数据也无需接收返回确认

    (4)应用场景:语音通话、视频直播

    Java提供了java.net.DatagramSocket类,来实现UDP通信

    DatagramSocket:用于创建客户端、服务端

    • public DatagramSocket():创建客户端的Socket,系统会随机分配一个端口号
    • public DatagramSocket(int port):创建服务端的Socket对象,并指定端口号
    • public void send(DatagramPacket dp):发送数据包
    • public void receive(DatagramPacket p):使用数据包接收数据

    DatagramPacket:创建数据包

    • public DatagramPacket(byte[] buf,int length,InetAddress address,int port):创建发出去的数据包对象
    • public DatagramPacket(byte[] buf,int length):创建用来接收数据的数据包
    • public int getLength():获取数据包,实际接收到的字节个数

    客户端:

    import java.net.*;
    
    public class UDPClient {
        public static void main(String[] args) throws Exception {
           
            //创建客户端Socket对象,随机分配端口号
            DatagramSocket client = new DatagramSocket(); //也可以指定
            //public DatagramPacket(字节数组, 数组长度, 服务器IP对象, 服务器端口号); 创建发送的数据包对象
            byte[] bytes = "礼物".getBytes();
            DatagramPacket dp = new DatagramPacket(
                    bytes,
                    bytes.length,
                    //InetAddress.getLocalHost(),
                    InetAddress.getByName("127.0.0.1"),
                    10000
    
            );
            //public void send(DatagramPacket dp); 发送数据包
            client.send(dp);
            //释放资源
            client.close();
        }
    }
    

    服务端:

    import java.io.IOException;
    import java.net.*;
    
    public class UDPServer {
        public static void main(String[] args) throws Exception {
            System.out.println("UDP服务端启动,等待接收数据:");
    
            //创建服务器Socket对象,并指定端口号
            DatagramSocket server = new DatagramSocket(10000);
    
            //创建用来接收的数据包对象
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
    
            //使用数据包接收数据
            server.receive(dp); //receive是阻塞的,等着接数据
    
            //展示数据
            int len = dp.getLength(); //len:代表本次接收的有效数据个数
            System.out.println(new String(bytes, 0, len));
    
            //DatagramPacket对象获取客户端其他信息
            System.out.println(dp.getAddress().getHostAddress());
            System.out.println(dp.getPort());
            //释放资源
            server.close();
        }
    }
    

在这里插入图片描述

TCP协议

(1)特点:面向连接的,可靠通信,通信效率相对不高

(2)TCP的最终目的,就是保证在不可靠的信道上,实现可靠的传输,传输数据不限制大小

(3)TCP协议通过三次握手建立连接,通过四次挥手断开连接

(4)应用场景:网页、文件下载、支付

Java提供了一个java.net.Socket类来实现TCP通信

  • public Socket(String host,int port):根据指定二点服务器ip,端口号请求与服务端建立连接,连接通过就获得了客户端socket
  • public ServerSocket(int port):创建服务端ServerSocket对象并绑定端口号
  • public OutputStream getOutputStream():获得字节输出流对象
  • public InputStream getInputstream():获得字节输入流对象
  • public Socket accept():阻塞等待客户端的连接请求,一旦连接成功返回服务端Socket对象

客户端:

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.DatagramSocket;
import java.net.Socket;
public class TCPClient {
    public static void main(String[] args) throws Exception {
       
        //根据指定的IP和端口创建客户端Socket对象
        Socket client = new Socket("127.0.0.1", 10010);
        //获取字节输出流对象(发送)
        OutputStream os = client.getOutputStream();
        //封装数据输出流
        DataOutputStream dos = new DataOutputStream(os);
        //写数据
        dos.writeUTF("发送礼物");
        //释放资源(释放new出来的资源)
        client.close();
        dos.close();
    }
}

服务端:

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        System.out.println("TCP服务端启动,等待接收数据:");
        //创建服务端ServerSocket对象并绑定端口号
        ServerSocket server = new ServerSocket(10010);
        //阻塞等待客户端的连接请求,一旦连接成功返回服务端Socket对象
        Socket serverSocket = server.accept();
        //获取字节输入流对象(接收)
        InputStream is = serverSocket.getInputStream();
        //封装数据输入流
        DataInputStream dis = new DataInputStream(is);
        //读取数据
        System.out.println(dis.readUTF());
        //释放资源
        server.close();
        dis.close();
    }
}

在这里插入图片描述

注意:如果没有启动服务器,单独启动客户端,会报错 java.net.ConnectException

原因:由于TCP是面向连接的,建立连接(三次握手)的时候失败

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

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

相关文章

【Spring MVC】MVC如何浏览器请求(service方法)

文章目录 1. DispatcherServlet 的 service 方法1.1. processRequest 方法1.2. doService 方法 背景:平时我们学习 MVC 重点关注的时DispatcherServlet 的 doDispatcher 方法,但是在 doDispatcher 方法之前 还有请求处理的前置过程,这个过程…

javaWeb学生信息管理

一、引言 学生信息管理系统是基于Java Web技术开发的一个全栈应用,用于管理学生的基本信息。本系统采用Eclipse作为开发工具,Navicat用于MySQL数据库管理,运行在JDK1.8、Tomcat9.0、MySQL8.0环境下。前端采用JavaScript、jQuery、Bootstrap4…

大语言模型之十四-PEFT的LoRA

在《大语言模型之七- Llama-2单GPU微调SFT》和《大语言模型之十三 LLama2中文推理》中我们都提到了LoRA(低秩分解)方法,之所以用低秩分解进行参数的优化的原因是为了减少计算资源。 我们以《大语言模型之四-LlaMA-2从模型到应用》一文中的图…

14:00面试,14:06就出来了,这问的过于变态了。。。

前言 刚从小厂出来,没想到在另一家公司我又寄了。 在这家公司上班,每天都要加班,但看在钱给的比较多的份上,也就不太计较了。但万万没想到5月一纸通知,所有人不准加班了,不仅加班费没有了,薪资…

Linux: 进程(控制)

目录 1.进程的创建 1.1fork函数 1.2fork创建子进程,OS做了什么? 1.3为什么要写实拷贝? 2.进程的终止 2.1进程终止,操作系统做了什么? 2.2进程常见的退出方式 2.3进程常见的退出方法 3.进程的等待 3.1为什么进行进程等待…

SpringCloud Alibaba - Seata 部署 TC 服务,并集成微服务

目录 一、Seata 架构 1.1、Seata 架构重要角色 1.2、部署 TC 服务 1.2.1、前言 1.2.2、下载 seata-server 包,解压 1.2.3、修改配置 1.2.4、在 nacos 中添加配置 1.2.5、创建数据库表 1.2.6、启动 TC 服务 1.3、微服务集成 Seata 1.3.1、引入依赖 1.3.2、…

面试题:熟悉设计模式吗?谈谈简单工厂模式和策略模式的区别

刚刚接触设计模式的时候,我相信单例模式和工厂模式应该是用的最多的,毕竟很多的底层代码几乎都用了这些模式。自从接触了一次阿里的公众号发的一次文章关于 DDD的使用 以后,就逐渐接触了策略模式。现在在项目中运用最多的也是这几种设计模式了…

使用mysql的cmd窗口,运行项目中的mapper层xml里的sql语句,查看运行结果

使用mysql的cmd窗口,运行项目中的mapper层xml里的sql语句,查看运行结果 项目代码或者从控制台复制sql语句从控制台搜索方式 运行效果或者使用idea的console窗口运行查看结果点击进入,查看表结构与字段 其他技巧根据from 表名寻找对应的sql代码…

Linux系统编程系列之线程属性

一、什么是线程属性 线程属性就是线程的属性,是一个用于控制线程行为和功能的参数集合。它可以影响线程的优先级、调度、同步行为和资源管理等方面。线程有许多属性,如分离属性,继承策略,调度策略等。看图 二、线程属性的特性 1、…

ctfshow 命令执行(40-50)

web40 题目过滤了很多 if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/[0-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\&#xff08;|\&#xff09;|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){eval($c);}}else{highlight_file(__FILE_…

pycharm 中的一个非常好使用的智能提示tabnine(大大提高代码的书写效率)

一. pycharm 中的代码智能提示插件 有时候,我们总是在写代码的时候,敲全部的代码,太过于麻烦了,如果有一个软件可以预知你的后续的操作,提前将代码给你写出来,你只需要检查对错,就可以了,这样就大大提高了工作的效率. 上面的一个插件是汉化pycharm的软件包,也是非常好用的一款…

小谈设计模式(14)—建造者模式

小谈设计模式&#xff08;14&#xff09;—建造者模式 专栏介绍专栏地址专栏介绍 建造者模式角色分类产品&#xff08;Product&#xff09;抽象建造者&#xff08;Builder&#xff09;具体建造者&#xff08;Concrete Builder&#xff09;指挥者&#xff08;Director&#xff0…

分享一款开源的QT的串口示波器

分享一款开源的QT的串口示波器&#xff0c;完全开源&#xff0c;支持串口、TCP、波形显示、通信协议。 Sailor Project功能说明 串口调试助手功能 支持传统的串口调试助手的基本收发功能&#xff0c;同时可以刷新大量的数据而不卡顿 支持保存接收的数据 支持最大200条可编辑…

cadence SPB17.4 S032 - Update Symbols失败的问题

文章目录 cadence SPB17.4 S032 - Update Symbols失败的问题概述笔记END cadence SPB17.4 S032 - Update Symbols失败的问题 概述 铺铜后, 进行DRC, 发现安装孔不太合适, 有DRC警告. 安装孔是一大孔, 上面打了一圈小孔. 这些小孔有警告, 说孔和孔之间不能干涉. 开始将这些DRC…

vue3+ts创建前端blog项目

vue3创建blog项目 cmd创建Manually select featuresChoose Vue versionUse class-style component syntax? (Y/n)Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)? (Y/n)Use history mode for router?Pick a CSS pre…

基于SpringBoot的科研工作量获奖项目管理平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

TinyWebServer学习笔记-MySQL数据库连接

为什么要用数据库连接池&#xff1f; 我们的网站允许用户注册&#xff0c;在没有池的情况下&#xff0c;假设只有一个人&#xff0c;那么流程就是&#xff0c;用户点击注册&#xff0c;通过socket将用户的账号和密码发送到服务器&#xff0c;然后就需要创建MySQL数据库连接&am…

C#制做一个 winform下的表情选择窗口

能力有限&#xff0c;别人可能都是通过其他方式实现的&#xff0c;我这里简单粗暴一些&#xff0c;直接通过点击按钮后弹出个新窗体来实现。 1、先在form1上增加一个toolstrip控件&#xff0c;再增加个toolstripbutton按钮&#xff0c;用来点击后弹出新窗体&#xff0c;如图&a…

【Linux】文件权限详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

【C++】可变参数模板使用,在emplace中应用

&#x1f30f;博客主页&#xff1a; 主页 &#x1f516;系列专栏&#xff1a; C ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ &#x1f60d;期待与大家一起进步&#xff01; 文章目录 一、可变参数模板1.参数包的展开方式1.递归方式展开2.逗号表达式展开参数包 二、empl…