javaEE-网络编程-3 UDP

目录

Socaket套接字 

UDP数据报套字节编程

1.DatagrameSocket类

DatagramSocaket构造方法:

DatagramSocaket常用方法:

2.DatagramPacket类

DatagramPacket构造方法:

UDP回显服务器实现

UDP服务端实现:

创建一个Socket类对象:

构造方法:

创建start()方法:

异常:

代码展示:

UDP客户端实现:

创建一个Socket对象:

构造方法:

start()方法:

​编辑 代码展示:

 结果:

服务端和客户端之间的执行流程:


Socaket套接字 

Socaket套接字是系统提供的,用于网络通信的技术。是基于TCP/IP协议的网络通信的基本单位。

基于Socaket套接字的网络程序开发就是网络编程。

简单来说,Socket就是操作系统中的一个概念,本质上是一种特殊的文件。

Socaket就是把“网卡”这样的概念给抽象成了文件,把网络通信和文件操作给统一了:

往Socket中写数据,就相当于通过网卡发送数据;从Socket中读数据,就相当于通过网卡接收数据。

Socaket套接字注意事项:

1. 客⼾端和服务端:开发时,经常是基于⼀个主机开启两个进程作为客⼾端和服务端,但真实的场 景,⼀般都是不同主机。

2. 注意 ⽬的IP 和 ⽬的端⼝号,标识了⼀次数据传输时要发送数据的终点主机和进程。

 3. Socket编程我们是使⽤  流套接字 和 数据报套接字,基于传输层的TCP或UDP协议,但应⽤层协议, 也需要考虑,这块我们在后续来说明如何设计应⽤层协议。

4. 关于端⼝被占⽤的问题

5. 如果⼀个进程A已经绑定了⼀个端⼝,再启动⼀个进程B绑定该端⼝,就会报错,这种情况也叫端⼝ 被占⽤

UDP数据报套字节编程

对于UDP来说,是无连接,面向数据报的特点。即每次都没有建立连接,并且一次发送全部的数据报,一次也接受全部的数据报。

UDP的socktet的api是如何实现的?

java中是由UDP协议通信,主要是使用DatagramSocket类来创建数据报套接字Socket。用DatapramPacket类来作为发送和接收数据报。

1.DatagrameSocket类

java中就是用DatagrameSocket 类来表示UDP Socket文件,用于接收和发送UDP数据报.

DatagramSocaket构造方法:

DatagramSocaket常用方法:

receive和send方法的 DatagramPacket 参数属于 “输出型参数”。

2.DatagramPacket类

DatagramPacket是UDP Socket发送和接收的数据报

使用这个类来表示UDP数据报,每次传输数据都要以UDP数据报为单位。

DatagramPacket构造方法:

DatagramPacket常用方法:

创建UDP发送数据DatagramPacket responseSocket时,需要指定发送的对方IP和端口号,要传入SocketAddress参数:目的主机的IP地址和端口号,该对象可以使用InteSocketAddress类来创建。

InteSocketAddress类

构造方法:

UDP回显服务器实现

写一个简单的UDP 服务器/客户端通信的程序 :回显服务器(Echo Server)

这个程序没有实现什么功能,就是调用Socket api,让客户端给服务器发送一个请求,请求就是从控制台输入的字符串,服务器再将这个字符串返回给客户端,客户端再将字符串打印显示出来。

DatagramSocket,DatagramPacket类都是再java.net包中的·:

服务器和客户端要创建一个Socket对象,服务器的Socket要显示指定一个端口号,而客户端Socket不需要显示指定(系统会自动分配一个随机端口号)

原因:

UDP服务端实现:

创建一个Socket类对象:

构造方法:

显示指定一个端口号

创建start()方法:

完成Socket的 接收客户端请求,做出响应 返回响应的功能,并循环执行

任务1.创建一个DatagramPacket类对象,接收用户的请求,调用receive方法

requestPacket:

任务2:根据请求 计算响应

任务3:将响应返回给客户端

responsePacket:

这里的第三个参数response.getBytes().length.不能写成response.length():

异常:

在这个程序中,会经常看到SockerException和IOException,要处理一下:

start()代码:

代码展示:

UdpEchoServer

/**
 * 实现UDP 回显服务器
 */

class UdpEchoServer{
    //创建DatagramSocket类,进行发送数据和接收数据
    private DatagramSocket socket=null;
    //UDP服务端 构造方法 serverPock: 指定端口号
    public UdpEchoServer(int serverPort) throws SocketException {
        socket=new DatagramSocket(serverPort);
    }
    //start方法中,完成Socket的 接收客户端请求,做出响应 返回响应的功能
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){//每次循环 ,就是处理一个请求-响应的过程
            //1.创建一个DatagramPacket类空对象,用来接收用户的请求
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            //通过receive接收用户的请求
            //此处可能会出现阻塞-》等待用户发送请求
            socket.receive(requestPacket);
            //2.根据请求 计算响应
            //先将请求转换成字符串 方便后面的操作
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());
            //计算响应
            String response=process(request);
            //3.将响应返回给客户端
            //先将响应打包成DatagramPacket, 指定数据内容、长度、要发给哪个客户端
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(), 0,response.getBytes().length,
                                            requestPacket.getSocketAddress());
           //将响应返回给客户端
            socket.send(responsePacket);
            //打印用户IP 端口号,请求信息 响应信息
            System.out.printf("[%s,%d],req:%s,resp:%s\n",requestPacket.getAddress(),requestPacket.getPort(),
                                                            request,response);
        }
    }

    public String process(String request) {
        //这里什么也不做,就将用户的请求返回
        return request;
    }
    //测试
    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer = new UdpEchoServer(9090);
        udpEchoServer.start();
    }
}

UDP客户端实现:

创建一个Socket对象:

构造方法:

start()方法:

 代码展示:


/**
 * 实现UDP 回显服务器
 * 客户端
 */

class UdpEchoClient1{
    private DatagramSocket socket=null;
    private String serverIP;//服务端IP
    private int serverPort;//服务端 端口号
    //构造方法 传入服务端的Ip 端口号 并保存
    public UdpEchoClient1(String serverIp,int serverPort) throws SocketException {
        socket=new DatagramSocket();
        this.serverIP=serverIp;
        this.serverPort=serverPort;
    }
    public void start() throws IOException {
        System.out.println("客户端启动");
        Scanner scan=new Scanner(System.in);
        while(true){
            System.out.print("->");
            //1.用户从控制台输入请求
            if(!scan.hasNext()){
                break;
            }
            //2.读取请求
            String request=scan.next();
            //3.将请求发送给服务器
            //先将请求打包成requestPacket , 指定内容,长度 ;指定要发送的服务器IP,端口号
            DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,
                                                            InetAddress.getByName(serverIP),serverPort);
            //发送请求 给服务器
            socket.send(requestPacket);
            //4.接收服务器的响应
            //先创建一个空的DatagramPacket,用来接收服务器的响应
            DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
            //接收服务器响应
            socket.receive(responsePacket);
            //将响应转换成String 打印在控制台
            String response=new String(responsePacket.getData(),0,responsePacket.getLength());
            System.out.println(response);
        }
    }

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

 结果:

客户端和服务端同时启动

DatagramPacket对象,共出现了三种形式:

1.创建空对象,用来存放请求的  参数:字节数组 数组长度

2.服务器 存放请求的响应结果  参数:  响应字节数组  数组长度  客户端IP和端口号

3.客户端 向服务端发送请求  参数:  请求字节数组  数组长度  服务端IP  服务端端口号

服务端和客户端之间的执行流程:

通过UDP服务端模拟实现一个"翻译词典":

参考代码:


/**
 * 实现一个词典翻译服务器
 * 英 译 汉
 */
class UdpDirectServer extends UdpEchoServer{
    //翻译服务器,连接功能与初始的服务器一样,通过继承UdpEchoServer类,
    // 重写process方法,实现特有功能
    //创建一个哈希表,通过键值对来实现一个查找的功能
    private HashMap<String,String> hashMap=new HashMap<>();
    public UdpDirectServer(int serverPort) throws SocketException {
        super(serverPort);
        //填充哈希表
        hashMap.put("cat","小猫");
        hashMap.put("dog","小狗");
        hashMap.put("pig","小猪");
        hashMap.put("flag","小鸟");
        //......
        //真实的翻译词典也是通过大量的键值对来实现查找功能的
    }
    //重写父类的process方法,实现"翻译"功能
    @Override
    public String process(String request) {
        return hashMap.get(request);
    }

    public static void main(String[] args) throws IOException {
        UdpDirectServer udpDirectServer = new UdpDirectServer(9090);
        udpDirectServer.start();
    }

}

参考结果:

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

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

相关文章

Linux:操作系统不朽的传说

操作系统是计算机的灵魂&#xff0c;它掌控着计算机的硬件和软件资源&#xff0c;为用户和应用程序提供了一个稳定、高效、安全的运行环境。 在众多操作系统中&#xff0c;Linux 的地位举足轻重。它被广泛应用于服务器、云计算、物联网、嵌入式设备等领域。Linux 的成功离不开…

模拟出一个三维表面生成表面点,计算体积,并处理边界点

python代码 生成表面点,计算体积,并处理边界点,最终模拟出一个三维表面。 步骤: 初始参数设置: initial_fixed_point:一个初始固定点的坐标。 slop_thre:坡度阈值。 v_thre:体积阈值。 slope_rad:将坡度从度转换为弧度。 step_size:步长。 lam_x, lam_y:泊松分布的…

STM32拓展 低功耗案例1:睡眠模式 (register)

需求描述 让MCU进入睡眠模式&#xff0c;然后通过串口发送消息来唤醒MCU退出睡眠模式。观察LED在进入休眠模式后是否仍然开启。 思考 首先睡眠模式&#xff0c;唤醒的条件是中断&#xff0c;外部内部都可以&#xff0c;这里的串口接收中断时内部中断。 拓展&#xff1a;中断…

vue 基础参数增加多语言配置

js 对数组的增删改查 字段在数据库存储为nvarchar &#xff0c;varchar存储波斯语会乱码 数组格式&#xff1a; {"en": [{"type": "10","value": "Confirm","color": ""},{"type": "…

[桌面运维]windows自动设置浅深色主题

设置自动浅色/深色主题 我看很多up主的教程过于繁琐&#xff0c;需要添加四个功能&#xff0c;并且有些还不能生效&#xff01; 大多数都是教程&#xff1a; 自动任务栏浅色 add HKCUSOFTWAREMicrosoftWindowsCurrentVersionThemesPersonalize/v SystemUsesLightTheme /t …

[ubuntu-22.04]ubuntu不识别rtl8153 usb转网口

问题描述 ubuntu22.04插入rtl8153 usb转网口不识别 解决方案 安装依赖包 sudo apt-get install libelf-dev build-essential linux-headers-uname -r sudo apt-get install gcc-12 下载源码 Realtek USB FE / GBE / 2.5G / 5G Ethernet Family Controller Softwarehttps:/…

基于Python的考研学习系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

图漾相机基础操作

1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件&#xff0c;可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据&#xff0c;还支持查看设备基础信息&#xff0c;在线修改gain、曝光等各种调节相机成像的参数功能…

Yocto 项目中的包管理系统详细解析

1. 包管理系统概念 包管理系统是用于管理软件包的工具和机制&#xff0c;包括创建、分发和安装软件包。Yocto 项目支持以下三种主要的包管理系统及其相关包格式&#xff1a; IPK (Itsy Package System)&#xff1a;适合轻量级嵌入式应用&#xff0c;通过 OPKG 管理。RPM (Red…

RISC-V学习笔记

1.RISC ISA1个基本整数指令集多个可选的扩展指令集&#xff0c;如RV32I表示支持32位整数指令集。I表示基本指令集&#xff0c;M表示整数乘法与除法指令集&#xff0c;A表示存储器原子指令集&#xff0c;F表示单精度浮点指令集&#xff0c;D表示双精度浮点指令集等&#xff0c;C…

第四届计算机、人工智能与控制工程

第四届计算机、人工智能与控制工程 The 4th International Conference on Computer, Artificial Intelligence and Control Engineering 重要信息 大会官网&#xff1a;www.ic-caice.net 大会时间&#xff1a;2025年1月10-12日 大会地点&#xff1a;中国合肥 (安徽大学磬苑…

Docker安装易有云(casaos安装易有云)

无法拉取易有云&DDNSTO Docker镜像&#xff1f; 官方视频 Docker方式安装易有云&#xff0c;包括并不限于Unraid/爱快/群晖等&#xff0c;只要有Docker的设备都成&#xff0c;包括一些Linux发行版等。 铁威马&#xff1a;首先在应用中心里安装Docker(TOS 4.0及更高的系统…

【计算机视觉技术 - 人脸生成】2.GAN网络的构建和训练

GAN 是一种常用的优秀的图像生成模型。我们使用了支持条件生成的 cGAN。下面介绍简单 cGAN 模型的构建以及训练过程。 2.1 在 model 文件夹中新建 nets.py 文件 import torch import torch.nn as nn# 生成器类 class Generator(nn.Module):def __init__(self, nz100, nc3, n…

手机投屏到电视的3种选择:无线本地投屏,无线远程投屏,AirPlay投屏

现在大部分手机投屏都要求连接相同的WiFi&#xff0c;这就意味着手机投屏到电视必须是近距离投屏&#xff0c;稍微远一点就会脱离WiFi连接范围&#xff0c;投屏失败。 如果想将手机远程投屏到安卓电视&#xff0c;要怎样做&#xff1f; 第一步&#xff0c;在手机和安卓电视都安…

zookeeper 数据类型

文章目录 引言I Znodezonde stat (状态信息)znode类型临时\永久序列化特性引言 在结构上与标准文件系统非常类似,拥有一个层次的命名空间,都是采用树形层次结构 Zookeeper树中的每个节点被称为:Znode,没有文件和目录之分。Znode兼具文件和目录两种特点Znode存储数据大小有…

73 mysql replication 集群的交互

前言 新建两个数据库, 分别为 192.168.220.132:3001, 192.168.220.132:3002 设置 192.168.220.132:3001 为 master, 192.168.220.132:3002 为 slave 配置文件如下 然后使用 mysqld --initialize 来初始化 data 目录, 以及相关基础数据库 这里会为 root 账户创建一个随机的…

CG顶会论文阅读|《科技论文写作》硕士课程报告

文章目录 一、基本信息1.1 论文基本信息1.2 课程基本信息1.3 博文基本信息 二、论文评述&#xff08;中英双语&#xff09;2.1 研究问题&#xff08;Research Problem&#xff09;2.2 创新点&#xff08;Innovation/Contribution&#xff09;2.3 优点&#xff08;Why this pape…

路由器的转发表

【4-24】 已知路由器R₁ 的转发表如表T-4-24 所示。 表T-4-24 习题4-24中路由器R₁的转发表 前缀匹配 下一跳地址 路由器接口 140.5.12.64/26 180.15.2.5 m2 130.5.8/24 190.16.6.2 ml 110.71/16 ----- m0 180.15/16 ----- m2 190.16/16 ----- ml 默认 11…

嵌入式驱动开发详解8(阻塞/非阻塞/异步通信)

文章目录 前言阻塞非阻塞异步通知后续 前言 首先来回顾一下“中断”&#xff0c;中断是处理器提供的一种异步机制&#xff0c;我们配置好中断以后就 可以让处理器去处理其他的事情了&#xff0c;当中断发生以后会触发我们事先设置好的中断服务函数&#xff0c; 在中断服务函数…

【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法)

【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型&#xff08;敏感性分析方法&#xff09; 引言 该文章实现了一个可解释的神经网络回归模型&#xff0c;使用BP神经网络&#xff08;BPNN&#xff09;来预测特征输出。该模型利用七个变量参数作为输入特征进行训练。为…