UDP数据报套接字编程

1. 什么是网络编程?

网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。
在这里插入图片描述
这里只是在开发学习的时候使用的是,不同的进程来代表不同的主机来模拟网络通信,网络变成的目的就在于实现不同主机间的数据资源交互,具体地就是A来获取网络资源,B能够对A的请求做出响应来提供网络资源。

网络编程中的基本概念:

发送端和接收端
在这里插入图片描述发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。
接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。
收发端:发送端和接收端两端,也简称为收发端。
注意:发送端和接收端只是相对的,只是一次网络数据传输产生数据流向后的概念。

请求和响应
请求和响应就对应着两次网络传输,第一次就是A向B发送一个请求,此时发出请求数据;第二次是B给A发送一个响应,发送的是响应数据。

服务端和客户端

服务端和客户端很好理解,提供服务的一方称之为服务端,反之,获取服务的一方就称之为客户端。
最常见的场景就是,客户端给指定的用户提供服务,服务端是提供用户服务的程序,流程大致如下:

  1. 客户端先发送请求到服务端
  2. 服务端根据请求数据,执行相应的业务处理
  3. 服务端返回响应:发送业务处理结果
  4. 客户端根据响应数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果)

在这里插入图片描述

2. Socket套接字

概念:Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。基
于Socket套接字的网络程序开发就是网络编程。

分类

类型特点
流套接字,使用传输层TCP协议,TCP,即Transmission Control Protocol(传输控制协议),传输层协议。有连接、可靠传输、面向字节流、有缓冲区、大小不限
数据报套接字,使用传输层UDP协议 ,UDP,即User Datagram Protocol(用户数据报协议),传输层协议。无连接、不可靠传输、面向数数据报、有接收缓冲区、无发送缓冲区、大小受限(<64k)

3. UDP数据报套接字编程

使用UDP数据报套接字编程必须先了解两个重要的API的使用,它们分别是 DatagramSocket APIDatagramPacket API

DatagramSocket API
DatagramSocket 是UDP Socket,用于发送和接收UDP数据报,他的构造方法如下:

方法签名方法说明
DatagramSocket()创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)
DatagramSocket(int port)创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)

客户端的进程在发送请求的时候,端口号一般来说就是我们的操作系统为我们分配的,给我们分配一个当前空闲的端口号,而服务器的端口号必须是我们指定的而且不能随机发生变化,就像我们打客服电话一样,客服电话一般都是固定的供我们发起“请求”,然后会根据我们的请求,给我们一些相应的响应。

DatagramSocket 主要方法:

方法签名方法说明
void receive(DatagramPacket p)从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)
void send(DatagramPacketp)从此套接字发送数据报包(不会阻塞等待,直接发送)
void close())关闭此数据报套接字

DatagramPacket API
DatagramPacket是UDP Socket发送和接收的数据报,他的构造方法如下:

方法签名方法说明
DatagramPacket(byte[] buf, int length)构造一个DatagramPacket以用来接收数据报,接收的数据保存在字节数组(第一个参数buf)中,接收指定长度(第二个参数length)
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address构造一个DatagramPacket以用来发送数据报,发送的数据为字节数组(第一个参数buf)中,从0到指定长度(第二个参数length)。address指定目的主机的IP和端口号

DatagramPacket的主要方法:

方法签名方法说明
InetAddress getAddress()从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址
int getPort()从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData()获取数据报中的数据

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创建。

InetSocketAddress API
InetSocketAddress ( SocketAddress 的子类 )构造方法:

方法签名方法说明
InetSocketAddress(InetAddress addr, int port)创建一个Socket地址,包含IP地址和端口号

4. 基于套接字编程写一个UDP服务器

服务器端代码:

public class UdpEchoServer {
    //网络编程本质上就是操作网卡。但是网卡是硬件 不方便操作,在操作系统中,使用一种特殊的叫“socket”这样的文件来抽象表示网卡
    //因此网络通信 现有一个socket对象
    private DatagramSocket socket = null;

    //作为服务器来说 要有一个固定的端口号 如果是操作系统来分配的话客户端就不知道端口号是多少了 也就无法通信
    public  UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("==========服务器启动==========");

        //服务器不止给一个客户端提供服务 真要有客户端发送来请求就必须响应 这里使用循环
        while (true){
            // 1. 读取用户发送来的数据
            //receive方法的参数是一个输出型参数 需要先构造好空白的DatagramPacket 对象 交给receive来填充
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);

            //此时的DatagramPacket是一个特殊的对象,将包含数据的部分拿出来 构造成一个字符串
            String request = new String(requestPacket.getData(), 0, requestPacket.getLength());

            //2. 根据请求计算响应
            String response = process(request);

            //3. 把响应写回到客户端
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());
            socket.send(responsePacket);

            //4. 打印一下 当前这次请求响应的处理中间结果
            System.out.printf("[%s:%s] req: %s; resp : %s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);

        }
    }

    public String process(String request){
        return request;
    }

    public static void main(String[] args) throws IOException {
        //指定端口号(1024-65535)
        UdpEchoServer server = new UdpEchoServer(9090);
        server.start();
    }
}

客户端代码:

public class UdpEchoClient {
    private DatagramSocket socket = null;

    //服务器的ip和端口
    private String serverIp = null;
    private int serverPort = 0;

    //一次通信需要有两个ip 两个端口号 :客户端的和服务器的
    //需要将服务器的IP和端口号告诉客户端才可以成功通信
    public UdpEchoClient(String serverIp, int serverPort) throws SocketException {
        socket = new DatagramSocket();
        this.serverIp = serverIp;
        this.serverPort = serverPort;
    }

    public void start() throws IOException {
        System.out.println("客户端启动...");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            //1.读取要发送的数据
            System.out.println("> ");
            String request = scanner.next();
            if(request.equals("exit")){
                System.out.println("Bye!");
                break;
            }
            //2.构造成UDP请求,并发送
            //  InetAddress.getByName(serverIp) --> IP需要填写的是32位整数形式,此时的ip是string 需要用这个方法转换
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(serverIp),serverPort);
            socket.send(requestPacket);
            //3.读取udp响应 并 解析
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            //4.把解析出来的结果显示出来
            String response = new String(responsePacket.getData(),0,responsePacket.getLength());
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient udpEchoClient = new UdpEchoClient("127.0.0.1", 9090);
        udpEchoClient.start();
    }
}

通过下面设置可以启动多个客户端的实例:
在这里插入图片描述查看结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
圈起来的分别是客户端的ip和端口,以及请求信息和返回的响应。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python:使用Scikit-image对遥感影像进行傅里叶变换特征提取(fourier)

作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Scikit-Image来进行傅里叶变换特征提取(fourier),并且提供一个示例代码,演示了如何在单波段遥感图像上应用这些方法。 傅里叶变换特征提取是一种数学工具,用于将图像中的细节、纹理和边缘信息以不同频率的方式呈现…

3.6每日一题(线性方程求通解)

1、判断类型选择方法&#xff1a;发现以y为未知函数&#xff0c;以x为自变量&#xff0c;不符合我们学过的类型 2、此时有两种方法&#xff1a; &#xff08;1&#xff09;x 与 y 对调&#xff0c;此时 x 为未知函数&#xff0c;y 为自变量 &#xff08;2&#xff09;变量代换…

吉他、班卓琴和贝斯吉他降分器:Arobas Music Guitar 8.1.1

Arobas Music Guitar 是一款专业的吉他、班卓琴和贝斯吉他降分器。在熟练的手中&#xff0c;它不仅可以让您创作&#xff0c;还可以编辑、聆听和录制&#xff0c;以及导入和导出乐谱。如果有人感兴趣的话&#xff0c;录音是在八个轨道上进行的&#xff0c;你可以为每个轨道单独…

reactos 可调试光盘映像

链接&#xff1a;https://pan.baidu.com/s/13M9BZN4IDrWLc3bjnHO79g?pwd0gst 提取码&#xff1a;0gst

视频增强修复软件Topaz Video AI mac中文版支持功能

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff…

VS Code2023安装教程(最新最详细教程)附网盘资源

目录 一.简介 二.安装步骤 三.VS Code 使用技巧 网盘资源见文末 一.简介 VS Code是一个由微软开发的跨平台的轻量级集成开发环境&#xff08;IDE&#xff09;&#xff0c;被广泛用于编写各种编程语言的代码。它支持多种编程语言&#xff0c;并且可以通过插件扩展功能。 以…

FPGA时序分析与约束(7)——通过Tcl扩展SDC

一、概述 术语“Synopsys公司设计约束”&#xff08;又名SDC&#xff0c;Synopsys Design Constraints&#xff09;用于描述对时序、功率和面积的设计要求&#xff0c;是EDA工具中用于综合、STA和布局布线最常用的格式。本文介绍时序约束的历史概要和SDC的描述。 二、时序约束…

Mac电脑Android Studio和VS Code配置Flutter开发环境(图文超详细)

一、安装Android Studio 官网地址&#xff1a; https://developer.android.google.cn/ 历史版本下载地址&#xff1a; https://developer.android.com/studio/archive?hlzh-cn 二、安装Xcode 到App Store下载安装最新版本&#xff0c;如果MacOS更新不到13.0以上就无法安装…

理解android AIDL

理解Android AIDL 在研究了 Android Frameworks 中进程间通信&#xff08;IPC&#xff09;相关的一些程序后&#xff0c;了解到 Android 系统中进程间通信的机制绝大部分就是 Binder&#xff0c;主要表现在系统服务的调用&#xff0c;app进程间功能调用等。而 Android 上实现 …

【c++|opencv】二、灰度变换和空间滤波---1.灰度变换、对数变换、伽马变换

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 灰度变换、对数变换、伽马变换 1. 灰度变换 #include <iostream> #include <opencv2/opencv.hpp>using namespace std; using namespace c…

redis原理 主从同步和哨兵集群

主从库如何实现数据一致 我们总说的 Redis 具有高可靠性&#xff0c;又是什么意思呢&#xff1f;其实&#xff0c;这里有两层含义&#xff1a;一是数据尽量少丢失&#xff0c;二是服务尽量少中断。AOF 和 RDB 保证了前者&#xff0c;而对于后者&#xff0c;Redis 的做法就是增…

Linux gzip命令:压缩文件或目录

gzip 是 Linux 系统中经常用来对文件进行压缩和解压缩的命令&#xff0c;通过此命令压缩得到的新文件&#xff0c;其扩展名通常标记为“.gz”。 再强调一下&#xff0c;gzip 命令只能用来压缩文件&#xff0c;不能压缩目录&#xff0c;即便指定了目录&#xff0c;也只能压缩目录…

软考系统架构师知识点集锦九:数据库系统

一、考情分析 二、考点精讲 2.1数据库概述 2.1.1数据库模式 (1)三级模式:外模式对应视图&#xff0c;模式(也称为概念模式)对应数据库表&#xff0c;内模式对应物理文件。(2)两层映像:外模式-模式映像&#xff0c;模式-内模式映像;两层映像可以保证数据库中的数据具有较高的…

【算法-数组2】有序数组的平方 和 长度最小的子数组

今天&#xff0c;带来数组相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输…

手机app爬虫配置(模拟机)

近期在做某个项目,涉及到需要对手机app的进行数据爬取。 下面将讲述具体配置步骤 1、安装手机模拟器 在百度上搜索手机模拟器就可以啦,这里以夜神模拟器夜神安卓模拟器-安卓模拟器电脑版下载_安卓手游模拟器_手机模拟器_官网为例子。 下载后,直接点击安装即可。 2、安装…

Mac怎么删除文件和软件?苹果电脑删除第三方软件方法

Mac删除程序这个话题为什么一直重复说或者太多人讨论呢&#xff1f;因为如果操作不当&#xff0c;可能会导致某些不好的影响。因为Mac电脑如果有太多无用的应用程序&#xff0c;很有可能会拖垮Mac系统的运行速度。或者如果因为删除不干净&#xff0c;导致残留文件积累在Mac电脑…

软考系统架构师知识点集锦十:计算机网络、数学与经济管理、知识产权与标准化

一、计算机网络 1.1、考情分析 2.1 TCP/IP协议簇 2.1.1常见协议及功能 网际层是整个TCP/IP体系结构的关键部分,其功能是使主机可以把分组发往任何网络并使分组独立地传向目标。 POP3: 110 端口&#xff0c;邮件收取SMTP: 25 端口&#xff0c;邮件发送FTP: 20数据端口/21控制…

最优值函数

一、最优状态值函数 解决强化学习任务大致上意味着找到一种政策&#xff0c;能够在长期内实现很多奖励。对于有限MDPs&#xff0c;我们可以精确地定义一种最优政策&#xff0c;其定义如下。值函数定义了政策的一种部分排序。如果一个政策的预期回报大于或等于另一个政策π0在所…

C++ 动态规划 DP教程 (一)思考过程(*/ω\*)

动态规划是一种思维方法&#xff0c;大家首先要做的就是接受这种思维方法&#xff0c;认同他&#xff0c;然后再去运用它解决新问题。 动态规划是用递推的思路去解决问题。 首先确定问题做一件什么事情&#xff1f; 对这件事情分步完成&#xff0c;分成很多步。 如果我们把整件…

ubuntu下英伟达显卡驱动及cuda安装

一、查看显卡需要安装的cuda版本及需要的驱动版本 进入官网查看&#xff1a; CUDA 12.3 Release Notes 比如需要装cuda12.2GA需要驱动版本至少为535.54.03 二、下载显卡驱动 2.1 进入官网下载界面&#xff1a; Official Drivers | NVIDIA&#xff0c;点击Beta and older dr…